2017-03-05 62 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