6

我在 nodejs 中使用Q库和异步库。

这是我的代码示例:

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

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

}, function() {

});

saveItem是一个承诺。当我运行它时,我总是得到cb is undefined,我想then()没有访问权限。任何想法如何解决这个问题?

4

1 回答 1

20

您的问题不在于承诺,而在于您对async.

async.each(items, handler, finalCallback)适用于数组handler的每一项。itemshandler函数是异步的,即它被传递一个回调,它必须在它完成它的工作时调用。当所有处理程序都完成后,将调用最终回调。

以下是解决当前问题的方法:

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这段特定的代码:仅 Promise 就可以很好地完成这项工作,尤其是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);
    }
)
于 2013-12-16T19:00:44.563 回答