for 循环在回调完成之前退出

for loop exit before callback is finished

我有一个调用异步函数的 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 循环,然后调用异步函数,然后直接退出。我该如何解决这个问题?

getVaccinAddress 是执行服务器调用的异步函数。

编辑

我正在使用 NodeJS,因此解决方案是使用 bluebird,但是我不知道如何使用 bluebird 实现它。

vaccines.length等于vaccinsCount

时可以调用callback()
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);
} 

我强烈建议在这种情况下使用 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);
});