我有一个未知数量的异步进程可能会从请求中运行。这些过程需要修改一段文本。
使用要修改的文本调用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”调用不是
答案 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部分)。
希望这会有所帮助!!