Node.js 原生 Promise.all 是并行处理还是顺序处理?

2024-04-30

我想澄清这一点,因为文档 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(使用前将#替换为@)

Node.js 原生 Promise.all 是并行处理还是顺序处理? 的相关文章

随机推荐