2017-07-11 31 views
-1

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

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) 
    } 
    }) 
} 
+0

如果您想在执行循环的下一次迭代之前等待getData的结果,则不能使用for循环。 –

回答

-1

您试图在同一时间创建99999,这在大多数浏览器中都没有成功。

改为使用promise,将它们推入数组中,然后使用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

首先,我强烈建议你调试代码,看看用什么发生了循环。

它很可能是循环在其内容(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循环中使用它,那就特别棘手。