2013-01-15 110 views
1

我正在使用caolan's async.js。我很困惑爲什麼在所有的迭代器完成之前回調函數都會被調用。當我運行下面的代碼:async.filter在所有迭代器完成之前調用回調

async.filter(matched_objects.fields, function(item, callback) { 
     console.log('checking field: ' + item.id); 
     if(item.id == 130 || item.id == 131) { 
     console.log('calling field true: ' + item.id); 
     callback(true); 
     } 
     callback(false); 
    }, 
    function(fieldResults) { 
     console.log('fieldsResults.length=' + fieldResults.length); 
    }); 

我得到以下輸出:

checking field: 130 
calling field true: 130 
fieldsResults.length=1 
checking field: 131 
calling field true: 131 

它沒有任何意義,我認爲在回調中的console.log是獲得第二之前調用在過濾器循環中檢查results.fields項目。

回答

6

問題是每次調用callback(false)時,即使您遇到if條件。正確的方法是添加一個return聲明:

if(item.id == 130 || item.id == 131) { 
    console.log('calling field true: ' + item.id); 
    return callback(true); // now you won't call callback(false) everytime 
} 
callback(false); 

你甚至可以說縮短過濾器:

callback(item.id == 130 || item.id == 131); 
+0

是的 - 因爲這個職位,我已經過了幾次這個教訓。 – akronymn

+0

我也是! ;) – Mrchief

+0

在你的第二個例子中,這只是返回語句,你把你的回調放在哪裏?爲什麼你需要一個'返回'?如果你想避免if/else爲了簡單起見,你不需要像'callback(item.id == 130 || item.id == 131)'這樣的東西嗎?對不起,我知道這已經有幾年了,在網上關於這種方法的例子並不多。謝謝。 – 1252748

0

經過更多的實驗後,我發現問題是回調(錯誤);線。顯然這導致過濾器退出。我想這是有道理的,因爲它會強制回調被調用。

相關問題