2017-06-28 58 views
0

我遇到了使用async.eachLimit的問題。它適用於前10個元素,但它不會繼續過去;它只是結束。所以,如果有100個元素,它只會在前10個元素。這顯然是我誤解回調的問題。使用eachLimit和不包含回調的外部函數的正確方法是什麼?還是這樣的功能需要一個?如何正確使用Javascript異步eachLimit

async.eachLimit(items, 10, function(item, callback) { 
     outsideFunction(item.attrOne, item.attrTwo}; 
     //callback(); ---> leads to all running in parallel. 
    }, 
    function(err) { 
     console.log(err); 
    } 
); 
+1

你是什麼意思,「一個不包含回調的外部函數」?它是否是異步的?如果是的話,當它沒有回調時,你怎麼知道它已經完成? – Bergi

回答

0

你這裏的問題是您使用的是異步庫函數不是異步的(或不像個它是異步的)。 async.eachLimit所做的是遍歷數組中的每個項目,一次只執行limit個數量,並且等待callback()被稱爲當前迭代已完成,並且可以添加另一個要執行的項目。

在您的代碼示例中,回調函數(未註釋時)在它嘗試調用outsideFunction後立即被調用,因爲該函數調用是非阻塞的。它不會等待,因爲異步說「我已經被告知完成了,我將進入下一個」,因此所有100個人都會嘗試並同時執行。如果outsideFunction是一個異步函數,那麼需要回調(或者讓它使用承諾)來表示它已經完成執行,並且在該回調中您調用async.eachLimit的回調,然後它將一次只能執行10次你要。這裏有一個例子:

async.eachLimit(items, 10, function(item, callback) 
{ 
    outsideFunction(item.attrOne, item.attrTwo, function(someResult) 
    { 
     // Your outside function calls back saying it's finished ... 
     callback(); // ... so we tell async we're done 
    }); 
}, 
function(err) 
{ 
    console.log(err); 
}); 

如果outsideFunction是不是你的函數,該函數實際上是異步的,那麼它的無論是使用承諾或你需要找到,妥善寫入異步函數庫。如果該功能不是異步的,那麼async.eachLimit將不起作用。

如果是你的函數,你應該讓它發回一個回調來說明它已經完成(或使用promise)。