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);
});
我有一个调用异步函数的 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);
});