【问题标题】:Detect the end of an async function inside a for loop in JavaScript在 JavaScript 的 for 循环中检测异步函数的结束
【发布时间】:2020-05-05 13:24:53
【问题描述】:

我想在 JavaScript 的 for 循环中检测异步函数的结束。

我的代码是:

  for (var i = 0; i < dataPoints.length; i++) {
  (function(i) {
    setTimeout(function() {


     if(end of everything)
     {
      //call xyz()
     }

    }, 5000 * i);
  })(i); 
}

请帮助我实现我的目标。谢谢

【问题讨论】:

  • 如果 i 等于长度.....队列将比所有时间超时都好得多
  • 你能解释一下吗?带有示例代码..
  • 这是另一个 setTimeout 必须包含在 Promise 问题中。真的需要一个好的社区管理来将重复链接到

标签: javascript for-loop asynchronous settimeout


【解决方案1】:

您可以检查i 是否是数组的最后一个索引:

 dataPoints = [1, 2, 3]; 
 for (var i = 0; i < dataPoints.length; i++) {
  (function(i) {
    setTimeout(function() {
      console.log(i);

     if(i === dataPoints.length - 1) // if i is the last iteration
     {
      console.log('the end');
      //call xyz()
     }

    }, 1000 * i); // changed 5s to 1s for demo
  })(i); 
}

【讨论】:

    【解决方案2】:

    通过您的设计,您可以检查超时是否是最后一个。

    function xyz() {
      console.log("done");
    }
    var dataPoints = ["a", "b", "c", "d", "e"]
    
    for (var i = 0; i < dataPoints.length; i++) {
      (function(i) {
        setTimeout(function() {
          console.log(i, dataPoints[i])      
          if (i === dataPoints.length - 1) {
            xyz()
          }
        }, 500 * i);
      })(i);
    }

    最好使用队列

    function xyz() {
      console.log("done");
    }
    var theData = ["a", "b", "c", "d", "e"]
    
    function displayData(dataPoints, done) {
      var iteration = 0
      function next() {
        console.log(dataPoints[iteration])
        iteration++
        if (iteration < dataPoints.length) {
          window.setTimeout(next, 1000)
        } else {
          done()
        }
      }
      next()
    }
    
    displayData(theData, xyz)

    【讨论】:

    • 这在逻辑上不是和他所拥有的不同吗?他的超时是并行运行的,你的第二个例子是顺序的?
    • @user120242 um 5000 * i
    • 你也可以只使用map datapoints 承诺并使用promise.all
    • @epascarello 是的,我知道它在技术上是相同的。但这在逻辑上不是一回事?
    • 它们并非同时运行。除非调用不是超时,否则不需要承诺,但可以使用承诺。
    猜你喜欢
    • 2014-07-09
    • 1970-01-01
    • 2012-10-31
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    相关资源
    最近更新 更多