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部分了解详细信息)。
希望这可以帮助!!