nodejs中的async和Q promise

时间:2013-12-16 18:46:41

标签: node.js asynchronous q node-async

我正在使用nodejs中的Q库和async库。

以下是我的代码示例:

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

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

}, function() {

});

saveItem是一个承诺。当我运行此操作时,我总是得到cb is undefined,我猜then()无法访问。任何想法如何解决这个问题?

1 个答案:

答案 0 :(得分: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);
    }
)