javascript - 按顺序执行Promise : understanding a claim made about this example code

标签 javascript promise ecmascript-6

我不是在寻找如何按顺序执行 promise 的解决方案,我只是试图理解博客作者给出的解决方案:

我正在阅读"We have a problem with promises"作者:Nolan Lawson,发布于 2015 年 5 月 18 日。

在“高级错误#3: promise 与 promise 工厂”下,他有一个应该是有效的示例:

// 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 将是一个已解决的 Promise,因此 promiseFactory 会立即运行?

我不明白这段代码如何确保 promiseFactory 函数中的代码按顺序运行。

最佳答案

forEach executes all functions at once

不,它一个接一个地运行它们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);

关于javascript - 按顺序执行Promise : understanding a claim made about this example code,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30803557/

相关文章:

javascript - NodeJs 中的参数未通过 Request 传递

javascript - 如何防止 react 上下文将重复的商品添加到购物车

javascript - Backbone : How to render template to DOM?

node.js - Promise 问题 : using Q. nfcall() 调用 mongoose.findOne()

reactjs - 请解释一下这个缩写的 ES6 JSX 声明

javascript - 如何在一行中默认导出命名导入?

javascript - 如何在JS es6类中实现多个方法?

javascript - 在chartjs的条形顶部添加图像

javascript - 自定义 Jasmine 匹配器和 promise

javascript - 如果 iterable 中的项目导致拒绝,则强制继续执行 BlueBird Promise.each