bluebird .all()不会调用

我有一个未知数量的asynchronous进程可能从请求运行。 有一个文本块被这些进程修改。

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

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”调用不是

部分问题是使用promisify()不正确。 这是为了将一个将callback作为最后一个参数的节点样式函数转换为一个返回promise的节点样式函数( 参见文档 )。

相反,你可以用上面的函数做的是,它会手动返回一个新的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调用来更新文本也是asynchronous的,因为try / catch块将永远不会捕获任何东西,因为它会运行,就像db启动。

所以你必须做的是让DB调用自己。 如果你正在使用一个节点数据库库(比如Mongoose等),你可以运行Promise.promisifyAll() ,并使用这个函数的Async版本(参见上面的promisifyAll部分了解详细信息)。

希望这可以帮助!!