在for循环中调用JavaScript异步函数

时间:2017-07-11 19:19:16

标签: javascript asynchronous

我有一个for循环,我想在每次迭代时调用异步函数。但我得到一个JS堆栈跟踪错误。下面是我的代码的原型。我也使用过IIFE模式,但它没有用。

for(let i = 0; i<99999;i++){
  getData(i, function(err, result){
      if(err) return err;
      else{
       console.log(result);
      }
  });
}
function getData(number, callback){
  request('http://someapiurl'+number, function(err, response){
     if(err) callback(err, null);
     else{
      callback(null, response)
     }
  })
}

2 个答案:

答案 0 :(得分:-1)

你试图同时制作99999,这在大多数浏览器上都没有用。

使用promises,将它们推入数组,然后使用Promise.all让浏览器处理请求,只需处理最终解析的响应。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

var p1 = Promise.resolve(3);
var p2 = 1337;
var p3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 'foo');
}); 

Promise.all([p1, p2, p3]).then(values => { 
  console.log(values); // [3, 1337, "foo"] 
});

答案 1 :(得分:-1)

首先,我强烈建议您调试代码以确切了解for循环会发生什么。

循环很可能在其内容(getData函数)执行之前完全运行,通过提取数据请求的异步行为。如果您尝试使用IIFE模式,您至少会以保证其内容执行的方式将内容包装在for循环中。实现的示例如下:

for(let i = 0; i<99999;i++){
  (function(){ // <-- IIFE used to represent a closure.
    getData(i, function(err, result){
      if(err) return err;
        else{
          console.log(result);
        }
    });
  })(i);
}

@mika为你承诺,你可以阅读他们的回答;只要记住反模式的承诺,你会没事的。如果你不习惯承诺并希望在for循环中使用它们,那就特别棘手了。