2017-03-05 58 views
0

我有一个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,因此解决的办法就是再使用蓝鸟,但是我对如何与蓝鸟实现这个不知道。

+0

搜索,以便与谷歌的环异步 – mplungjan

+0

我已经和我还是不要不明白我怎么能使它工作。 –

+0

你的代码不完整,getVaccinAddress函数中有什么? –

回答

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); 
} 
+0

我试过这个,但代码永远不会进入if(vaccines.lenght === vaccinesCOunt) –

+0

@Rémi_“我已经尝试过,但代码永远不会进入if(vaccines.lenght === vaccinesCOunt)“_这就是为什么如果错误发生时询问预期结果是什么,或者'result.success'没有评估为'true',这可能是'vaccines.length === vaccinsCount'不会评估的原因之一到'真'。如果'i'等于'vaccinsCount',您可以选择调用'callback',而不管result.success的结果是否为'true'。是否记录了任何错误?所有对'getVaccinAddress'的调用都是'result.success'' true'? – guest271314

3

我强烈建议在这种情况下使用的承诺。 这是管理你的异步调用的好方法: 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); 
}); 
+0

我虽然关于使用promis,但我在NodeJS编码,因此我不确定如何使这项工作。 –

+0

@Rémi使用Bluebirdjs – majidarif

+0

如果您使用的是NodeJS,那么效果会更好。安装蓝鸟,它比标准承诺快得多:http://bluebirdjs.com/docs/getting-started.html – timhysniu