2016-12-01 46 views
0

我有這樣的代碼,'for'沒有執行。nodejs塊,直到'for'迭代完成

var obj = []; 
      for (var i = 0, len = param.destinations.length; i < len; i++) { 
       var params = { 
        origins: param.origins, 
        destinations: param.destinations[i] 
       } 
       test(params, function(err, response) { 
        console.log(response); 
        return obj.push(response); 
       }) 
      } 
      console.log(obj); 
      return callback(null, obj); 

如何解決

+0

if'param.destinations.length' == 0,你永遠不會爲 – Fefux

+0

做param.destinations有長度嗎? – yBrodsky

+0

什麼是錯誤? –

回答

1

的問題是你同時運行:

console.log(obj); 
return callback(null, obj); 

任何測試回調解僱之前。無論循環是否運行,它始終是[]

一個簡單的解決辦法是這樣的:

var obj = []; 
var n = 0; 
for (var i = 0, len = param.destinations.length; i < len; i++) { 
    var params = { 
     origins: param.origins, 
     destinations: param.destinations[i] 
    } 
    test(params, function(err, response) { 
     console.log(response); 
     obj.push(response); 
     if (++n === len) { 
      console.log(obj); 
      callback(null, obj); 
     } 
    }) 
} 

你需要有一個計數器,看看有多少回調已經打來電話,在最後一個做你的需要。

這是一個手動解決方案,適用於這樣的簡單情況。對於更復雜的情況,您可能需要使用async或使用promises,可能使用的庫如BluebirdQ

+0

如何解決運行回調,直到'for'完成? –

+0

@AanElzam只有在循環計數器到達計數器的最後一個索引時纔會調用回調 –

+0

@AanElzam或者您可以使用專門爲此設計的Promise – Fefux

0

我懷疑test()函數看起來非常像異步函數,可能會碰到一個數據庫或其他一些I/O。如果是這種情況,那麼你的return語句可以在anthing被放入你的obj之前達成。確保test()是同步的,因此阻塞。另一種看待這個問題的方式是異步函數不能成爲循環的一部分,這是同步的。扎爾戈呼叫!

因此,如果使它不是一個選項,最簡單的方法是創建一個變量來計算響應的test()回調的數量。然後,如果回調數等於您發送的回調數,則執行最終回調。

var obj = []; 
var testsCompleted = 0; 
var len = param.destinations.length; 
      for (var i = 0; i < len; i++) { 
       var params = { 
        origins: param.origins, 
        destinations: param.destinations[i] 
       } 
       test(params, function(err, response) { 
        console.log(response); 
        obj.push(response); 
        testsCompleted++; 
        if (testsCompleted == len){ 
         console.log(obj); 
         return callback(null, obj); 
       } 
     }) 
}