【问题标题】:Node.js: Execution after for loopNode.js:for循环后执行
【发布时间】:2018-11-28 21:09:09
【问题描述】:

我正在构建一些 Node.js 应用程序并具有这样的功能:

function ex() {
  allowUA = false;

  for (var i = 0; i < arr.length; i++) {
    (function(index) {
      setTimeout(() => {
        console.log(index);
      }, i * 3000);
    })(i);
  }

  if (i == arr.length - 1) {
    allowUA = true;
  }
}

我想要的只是该函数以严格的顺序执行(将变量更改为 false,执行循环,然后将变量更改回 true)

我发现这并不像看起来那么容易,所以我请求你的帮助。

有没有办法做到这一点?提前致谢。

【问题讨论】:

  • 一种方法是去掉setTimeout
  • @Sushanth——不可能。这里很关键。上面的只是一个例子。我希望你不是说这是唯一可能的解决方案......
  • 思考一下 JavaScript 是如何运行这段代码的。它将非常快速地运行for 循环,并且每个setTimeout 将几乎同时运行。您的变量 i 将到达循环的末尾,并且您设置的条件将评估为真毫秒,远在超时终止之前。那么,在将此值设置为 true 之前,您希望您的函数做什么?了解这一点可以帮助我们为您提供建议。

标签: javascript node.js loops asynchronous intervals


【解决方案1】:

您可以使用Promise 确保首先解决超时,然后在所有承诺都解决后记录下一个条件。

let allowUA = false;
let arr = [1, 2, 3]

function ex() {
  allowUA = false;
  console.log('false');

  // iterate over the array and create a promise for each iteration
  let promises = arr.map(function(value, index) {
    return new Promise(function(resolve) {
      setTimeout(() => {
        console.log(index);
        // resolve the promise
        resolve();
      }, index * 500);
    });
  })

  // run this when all the promises resolve themselves
  Promise.all(promises).then(function() {
    allowUA = true;
    console.log('true');
  });
}

ex()

【讨论】:

    【解决方案2】:

    这是一个 async/await 方法,它放弃了 for/循环,转而使用 setTimeout 调用具有缓慢缩短数组的函数:

    async function ex(arr) {
      allowUA = false;
      console.log(allowUA);
    
      function logger(arr) {
        return new Promise((resolve, reject) => {
          (function loop(arr) {
            const [head, ...rest] = arr;
            if (!arr.length) {
              resolve();
            } else {
              console.log(head);
              setTimeout(() => loop(rest), head * 1000);
            }
          }(arr));
        });
      };
      
      await logger(arr);
    
      allowUA = true;
      console.log(allowUA);
    }
    
    const arr = [1, 2, 3, 4];
    ex(arr);

    【讨论】:

      猜你喜欢
      • 2015-04-01
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多