回调完成前for循环退出

时间:2017-03-05 21:36:38

标签: javascript asynchronous callback bluebird

我有一个调用异步函数的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实现它。

2 个答案:

答案 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);
}