2013-12-16 139 views
6

我在nodejs中使用Q庫和async庫。nodejs中的異步和Q承諾

這裏是我的代碼示例:

async.each(items, cb, function(item) { 

saveItem.then(function(doc) { 
    cb(); 
}); 

}, function() { 

}); 

saveItem是一個承諾。當我運行這個,我總是得到cb is undefined,我想then()沒有訪問權限。任何想法如何解決這個問題?

回答

20

你的問題不在於承諾,它與你的使用async

async.each(items, handler, finalCallback)handler應用於items陣列的每個項目。 handler函數是異步的,即它是一個回調函數,它在完成工作時必須調用。當所有處理程序完成時,最終回調被調用。

這裏是你會如何解決當前的問題:

var handler = function (item, cb) { 
    saveItem(item) 
    .then(
    function() { // all is well! 
     cb(); 
    }, 
    function (err) { // something bad happened! 
     cb(err); 
    } 
); 
} 

var finalCallback = function (err, results) { 
    // ... 
} 

async.each(items, handler, finalCallback); 

不過,你不需要使用async這個特定的代碼塊:單獨承諾很好地填補了這一工作,特別是與Q.all()

// Create an array of promises 
var promises = items.map(saveItem); 

// Wait for all promises to be resolved 
Q.all(promises) 
.then(
    function() { // all is well! 
     cb(); 
    }, 
    function (err) { // something bad happened! 
     cb(err); 
    } 
) 
+0

完美使用'Q.all',謝謝! – dzm

+0

偉大的你提到'Q.all'解決方案 – Krym

+0

熱門代碼。肯定會使用這個有趣和利潤。 :) – Antoine