Sự cố của bạn không nằm trong lời hứa, nó nằm với việc bạn sử dụng async
.
async.each(items, handler, finalCallback)
áp dụng handler
cho mọi mục của mảng items
. Hàm handler
là không đồng bộ, tức là nó được gửi một cuộc gọi lại, mà nó phải gọi khi nó đã hoàn thành công việc của nó. Khi tất cả các trình xử lý được thực hiện, cuộc gọi lại cuối cùng được gọi.
Đây là cách bạn muốn khắc phục vấn đề hiện tại của bạn:
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);
Tuy nhiên, bạn không cần phải sử dụng async
cho đoạn cụ thể mã này: hứa hẹn một mình điền vào công việc này khá độc đáo, đặc biệt với 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);
}
)
Nguồn
2013-12-16 19:00:44
Hoạt động hoàn hảo bằng cách sử dụng 'Q.all', cảm ơn! – dzm
Tuyệt vời bạn đã đề cập đến giải pháp 'Q.all' – Krym
Mã nóng. Chắc chắn sẽ được sử dụng này cho vui và lợi nhuận. :) – Antoine