我想澄清这一点,因为文档 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all对此还不是太清楚;
Q1: Is Promise.all(iterable)
顺序或并行处理所有承诺?或者,更具体地说,它是否相当于运行链式承诺,例如
p1.then(p2).then(p3).then(p4).then(p5)....
或者是其他某种算法,其中所有p1
, p2
, p3
, p4
, p5
等同时(并行)调用,并且一旦所有解析(或一个拒绝)就返回结果?
Q2: If Promise.all
并行运行,是否有一种方便的方法来顺序运行可迭代对象?
Note:我不想使用 Q 或 Bluebird,而是使用所有原生 ES6 规范。
Is Promise.all(iterable)
履行所有承诺?
不,承诺不能“被执行”。当他们正在做的时候,他们就开始他们的任务created- 它们仅代表结果 - 并且you甚至在将它们传递给之前就并行执行所有内容Promise.all
.
Promise.all
只做await多重承诺。它不关心它们解析的顺序,也不关心计算是否并行运行。
有没有一种方便的方法来顺序运行可迭代对象?
如果你已经有了你的承诺,你就无能为力了Promise.all([p1, p2, p3, …])
(没有顺序的概念)。但是,如果您确实有可迭代的异步函数,那么您确实可以顺序运行它们。基本上你需要从
[fn1, fn2, fn3, …]
to
fn1().then(fn2).then(fn3).then(…)
解决方案是使用Array::reduce https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce:
iterable.reduce((p, fn) => p.then(fn), Promise.resolve())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)