如何理解Array的reduce方法中Promise.resolve的引入

时间:2019-03-26 03:14:16

标签: es6-promise

const tasks = [f1, f2, f3];
        tasks.reduce(async (promise, task) => {
            await promise;
            await task();
        }, Promise.resolve)
  • 1,Promise.resolve的作用
  • 2,等待诺言的作用; 谢谢~~

1 个答案:

答案 0 :(得分:0)

使用.reduce()的设计模式是序列化许多承诺返回操作。因此,逻辑是您等待上一个诺言,然后在完成后执行下一个任务,并在整个循环中重复执行下一个循环,将诺言作为下一个循环的值返回。

要使第一个迭代在不使用特殊代码的情况下就可以工作,则需要一个可以最初等待的承诺。因此,您传递了一个由Promise.resolve()创建的已经解决的承诺来“启动泵”,并为其提供使用的初始承诺。

如果解开.reduce()循环,那么在您的示例中,您基本上会得到以下结果:

Promise.resolve().then(f1).then(f2).then(f3)

Promise.resolve()开始链避免了循环的第一次迭代时的特殊大小写。

可以写成:

f1().then(f2).then(f3)

但是,在某些特殊情况下,第一个任务实际上使用了.reduce()之类的东西,这使事情变得复杂,这在循环的每次迭代中执行相同的操作时最简单。因此,从Promise.resolve()开始可以使第一次迭代与其他所有迭代完全相同。

关于您的两个要点:

  

Promise.resolve()的作用

.reduce()给出等待第一次迭代的初始承诺。

  

await promise

的角色

这要等到循环的上一个迭代完成后再调用下一个任务。


注意:要完全理解此代码,必须完全了解.reduce()的工作方式。您向它传递两个参数,即回调函数和初始值。该初始值将作为回调的第一个参数(您命名为promise)传递给回调的第一次迭代。

然后,您从该回调返回的任何值都将作为该值传递给回调的下一个迭代。由于您使用的是async回调, 返回一个Promise,您的回调将始终返回一个Promise,这将传递给回调的下一个迭代。而且,由于回调的第一件事是await promise,因此您最终获得了“链式”承诺,从而可以序列化执行任务。