nodejs 中的异步和 Q 承诺

Posted

技术标签:

【中文标题】nodejs 中的异步和 Q 承诺【英文标题】:async and Q promises in nodejs 【发布时间】:2014-01-04 06:55:13 【问题描述】:

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

这是我的代码示例:

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

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

, function() 

);

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

【问题讨论】:

【参考方案1】:

你的问题不在于承诺,而在于你对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:仅 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);
    
)

【讨论】:

你提到了Q.all解决方案 热代码。肯定会用它来获得乐趣和利润。 :)

以上是关于nodejs 中的异步和 Q 承诺的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs 异步承诺队列

需要帮助在 NodeJS 中使用 Sinon 存根异步 / 等待承诺

猫鼬承诺和Q承诺

JavaScript NodeJS 如何将流/承诺与异步函数一起使用?

与 fs 和 bluebird 的承诺

节点 q 承诺递归