2014-07-16 48 views
1


我有接受兩個數組和回調函數的函數,我使用async.each遍歷其中一個數組(並嘗試使用async.forEach並且兩者都有相同的結果),一切正常,但我作爲參數接收的回調,作爲第三個參數發送,在第一次迭代後觸發。這是我的代碼。async.each/forEach每個間隔後觸發第三個參數(回調)

function itemLikes(instruments,likes, finalCallback){ 
var items = []; 
if(instruments.length >= 1){ 
    async.forEach(instruments, function(instrument,cb){ 
     if(likes){ 
      if(likes.indexOf(instrument._id.toString()) !== -1){ 
       instrument.liked = 1; 
       cb(items.push(instrument)) 
      } 
      else{ 
       cb(items.push(instrument)) 
      } 
     } 
     else{ 
      cb(items.push(instrument)) 
     } 
    }, function(err){ 
     finalCallback(items) 
    }) 
} 
else{ 
    finalCallback(items) 
} 

}

這是我從文檔的理解,但我的finalCallback被觸發我的第一次迭代完成之後。

感謝和問候。

+0

嗨似乎要傳遞同樣喜歡作爲一個數組,而你最初定義喜歡作爲函數 –

+0

@VivekBajpai,我爲了簡潔而改變了函數的名字,我想我不應該那樣做。 – Babar

回答

2

在第一次迭代之後觸發作爲參數(finalCallback())接收的回調的原因是因爲使用非空值調用了asyc.each()的回調(cb)。當它用非空值調用時,async.each()的最終回調被調用,然後調用你的finalCallback()。你需要做這樣的事情:

if(likes){ 
    if(likes.indexOf(instrument._id.toString()) !== -1){ 
    instrument.liked = 1; 
    items.push(instrument); 
    cb() 
    } else{ 
    items.push(instrument); 
    cb() 
    } 
} else{ 
    items.push(instrument); 
    cb() 
} 

好像你的邏輯上面可以簡化爲以下幾點:

if(likes && likes.indexOf(instrument._id.toString()) !== -1){ 
    instrument.liked = 1; 
} 
items.push(instrument); 
cb() 
+0

對,我很愚蠢,完全忽略了我們使用null或no參數執行回調的部分,非常感謝 – Babar

相關問題