我有一系列需要执行的功能。
这些功能全部返回一个承诺。

我想依次运行所有功能,但是只有完成前一个功能的承诺后,才能启动下一个功能。

我认为使用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/

10-11 12:45
查看更多