我有一个调用异步函数的for循环。我需要这个函数然后在for循环结束时调用一个回调,但只有当我的所有异步函数都返回了它们的结果时。我试过这个:
for(var i = 0; i < vaccinsCount; i++){
getVaccinAddress(i, address, provider, function(result){
if(result.success){
console.log("result:" + result.values);
vaccines.push(result.values);
} else {
callback({success: false, message: result.message});
}
});
}
callback({success: true, values: vaccines});
而不是发生的事情是代码进入for循环然后调用async函数然后退出straigh。我怎么能绕过这个?
getVaccinAddress是执行服务器调用的异步函数。
修改
我正在使用NodeJS,因此解决方案是使用bluebird,但我不知道如何用bluebird实现它。
答案 0 :(得分:3)
我强烈建议在这种情况下使用promises。 这是管理异步调用的好方法: https://davidwalsh.name/promises
如果您使用promises,您的代码将如下所示:
var promises = []
for(var i = 0; i < vaccinsCount; i++){
promises.push(getVaccinAddress(i, address, provider));
// getVaccinAddress will need to return a promise
}
Promise.all(promises).then(function(result) {
console.log('success');
})
.catch(function(err) {
console.log(err);
});
答案 1 :(得分:2)
当callback()
等于vaccines.length
vaccinsCount
for(var i = 0; i < vaccinsCount; i++) {
(function(i) {
getVaccinAddress(i, address, provider, function(result) {
if(result.success) {
console.log("result:" + result.values);
vaccines.push(result.values);
if (vaccines.length === vaccinsCount) {
// call `callback()` here
}
}
});
})(i);
}