我有一系列需要执行的功能。
这些功能全部返回一个承诺。
我想依次运行所有功能,但是只有完成前一个功能的承诺后,才能启动下一个功能。
我认为使用async或bluebird库会很容易,但是我找不到一个简单的解决方案。
这是我制作(未试用)的内容,但是我正在寻找标准库解决方案,因为这可能已经存在?
function runFuncs(funcs) {
function funcRunner(funcs, resolve, reject, pos=0) {
funcs[pos]().then(function() {
pos++;
if (pos < length(funcs)) {
funcRunner(funcs, pos);
} else {
resolve();
}
}).catch(function(err) {
reject(err);
});
}
return new Promise(function(resolve, reject) {
funcRunner(funcs, resolve, reject);
});
}
最佳答案
我知道您已经标记了一个答案,但是我还不能发表评论,不得不问:您的示例似乎并未将结果从一个函数传递给另一个函数,您真的需要它们顺序运行吗?
如果对序列有严格的要求,Bluebird的.mapSeries()
方法将完全满足您的要求,并且代码非常整洁。否则,您可以交换.map()
并利用并发性并行完成任务。
Promise.mapSeries(fnArray, (fn) =>
{
return fn(...);
})
.then((results) =>
{
// do something with the results.
});
或与
.map()
并行:Promise.map(fnArray, (fn) =>
{
return fn(...);
},
{ concurrency: 5 })
.then((results) =>
{
// do something with the results.
});
关于javascript - 运行在 promise 完成后按顺序返回 promise 的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37080705/