你的問題不在於承諾,它與你的使用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);
}
)
完美使用'Q.all',謝謝! – dzm
偉大的你提到'Q.all'解決方案 – Krym
熱門代碼。肯定會使用這個有趣和利潤。 :) – Antoine