bluebird .all()不会调用.then

时间:2014-10-11 06:00:10

标签: node.js promise bluebird

我有一个未知数量的异步进程可能会从请求中运行。这些过程需要修改一段文本。

使用要修改的文本调用UpdateScript,它有一个我想在一切都完成时运行的回调。

var promise = require('bluebird');

function updateScript(text, cb){
   var funcChain = [],
      re = some_Regular_Expression,
      mods = {text: text};
   while (m = re.exec(mods.text)) {
      // The text is searched for keywords. If found a subprocess will fire
      ....
      funcChain.push( changeTitleAsync(keyword, mods) );
   }
   promise.all(funcChain)
   .then(function(){
      // This is never called.
      cb(mods.text);
   });
}

function changeTitle(encryptedId, mods){
   try{
       // database request modifies mods.text
   }catch(e){
     throw e;
   }
}
var changeTitleAsync = promise.promisify(changeTitle);

调用changeTitle代码,但“then”调用不是

1 个答案:

答案 0 :(得分:2)

部分问题是promisify()的使用不正确。这意味着将一个节点样式函数转换为一个返回promise(see docs here)的函数,该函数将回调作为最后一个参数。

相反,你可以用上面的函数做的就是让它像这样手动返回一个新的Promise:

function changeTitle(encryptedId, mods) {
  return new Promise(function(resolve, reject){
    try {
      // do something then resolve promise with results
      var result = ...
      resolve(result)
    } catch (e) {
      // reject the promise with caught error
      reject(e)
    }
  })
} 

<强>无论其 上面有一个错误:我假设更新文本的db调用也是异步的,因此try / catch块永远不会捕获任何东西,因为它会在db开始时正常运行。

所以你需要做的就是宣传数据库调用本身。如果您正在使用节点数据库(如Mongoose等),则可以针对它运行Promise.promisifyAll(),并使用Async版本的函数(有关详细信息,请参阅上面链接的promisifyAll部分)。

希望这会有所帮助!!