按顺序执行promise:理解有关此示例代码的声明

时间:2015-06-12 12:50:19

标签: javascript promise ecmascript-6

我不是在寻找如何按顺序执行promises的解决方案,我正在尝试理解博客作者给出的一个:

我正在阅读2015年5月18日发布的Nolan Lawson "We have a problem with promises"

在“高级错误#3:承诺与承诺工厂”之下,他有这个应该是工作的例子:

// Setup, just a meta explanation what a function looks like
function promiseFactory() {
  return somethingThatCreatesAPromise();
}

// Actual example; promiseFactories could be an Array
function executeSequentially(promiseFactories) {
    var result = Promise.resolve();
    promiseFactories.forEach(function (promiseFactory) {
        result = result.then(promiseFactory);
    });
    return result;
}

我不明白为什么会有效。 forEach一次执行所有功能。 result将是一个已解决的承诺,因此promiseFactory会马上运行吗?

我不知道这段代码应该如何确保promiseFactory函数中的代码按顺序运行。

1 个答案:

答案 0 :(得分:3)

  

forEach一次执行所有功能

不,它一个接一个地运行forEach 非异步

让我们看一个示例迭代:

// The first result is already resolved, so as to allow
// the first 'then' to trigger
var result = Promise.resolve();
promiseFactories.forEach(function (promiseFactory) {
    // First iteration: result = ResolvedPromise.then(promiseFactory)
    // Second iteration result = promiseFactoryResult.then(nextPromiseFactory);
    // and so on...
    result = result.then(promiseFactory);
});

因此,它一个接一个地循环遍历类似数组的对象,将nextPromiseFactory创建的promise的结果链接到result变量。

它基本上和做的一样:

var result = Promise.resolve().then(promiseFactory).then(promiseFactory).then(promiseFactory);