我有一个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)
}
})
}
答案 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循环中使用它们,那就特别棘手了。