2013-12-16 19 views
6

Tôi đang sử dụng thư viện Q và thư viện async trong nútjs.async và Q hứa hẹn trong nodejs

Dưới đây là một ví dụ về mã của tôi:

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

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

}, function() { 

}); 

saveItem là một lời hứa. Khi tôi chạy điều này, tôi luôn nhận được cb is undefined, tôi đoán then() không có quyền truy cập. Bất kỳ ý tưởng làm thế nào để làm việc xung quanh này?

Trả lời

20

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); 
    } 
) 
+0

Hoạt động hoàn hảo bằng cách sử dụng 'Q.all', cảm ơn! – dzm

+0

Tuyệt vời bạn đã đề cập đến giải pháp 'Q.all' – Krym

+0

Mã nóng. Chắc chắn sẽ được sử dụng này cho vui và lợi nhuận. :) – Antoine

Các vấn đề liên quan