for循环退出回调完成之前
我有一个for循环调用一个异步函数。我需要这个函数然后在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,因此解决的办法就是再使用蓝鸟,但是我对如何与蓝鸟实现这个不知道。
您可以拨打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);
}
我试过这个,但代码永远不会进入if(vaccines.lenght === vaccinesCOunt) –
@Rémi_“我已经尝试过,但代码永远不会进入if(vaccines.lenght === vaccinesCOunt)“_这就是为什么如果错误发生时询问预期结果是什么,或者'result.success'没有评估为'true',这可能是'vaccines.length === vaccinsCount'不会评估的原因之一到'真'。如果'i'等于'vaccinsCount',您可以选择调用'callback',而不管result.success的结果是否为'true'。是否记录了任何错误?所有对'getVaccinAddress'的调用都是'result.success'' true'? – guest271314
我强烈建议在这种情况下使用的承诺。 这是管理你的异步调用的好方法: https://davidwalsh.name/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);
});
搜索,以便与谷歌的环异步 – mplungjan
我已经和我还是不要不明白我怎么能使它工作。 –
你的代码不完整,getVaccinAddress函数中有什么? –