const tasks = [f1, f2, f3];
tasks.reduce(async (promise, task) => {
await promise;
await task();
}, Promise.resolve)
答案 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
,因此您最终获得了“链式”承诺,从而可以序列化执行任务。