一尘不染

等待VS Promise.all

node.js

之间有什么区别:

const promises = await Promise.all(items.map(e => somethingAsync(e)));
for (const res of promises) {
  // do some calculations
}

还有这个 ?

for await (const res of items.map(e => somethingAsync(e))) {
  // do some calculations
}

我知道在第一个摘要中,所有的诺言都同时被兑现了,但是我不确定第二个。for循环是否等待第一次迭代完成以调用下一个promise?还是所有的诺言都在同一时间触发,循环的内部就像它们的回调一样?


阅读 229

收藏
2020-07-07

共1个答案

一尘不染

是的,它们绝对不同。for await应该与异步迭代器一起使用,而不是与预先存在的promise数组一起使用。

为了清楚起见,

for await (const res of items.map(e => somethingAsync(e))) …

与…相同

const promises = items.map(e => somethingAsync(e));
for await (const res of promises) …

要么

const promises = [somethingAsync(items[0]), somethingAsync(items[1]), …);
for await (const res of promises) …

somethingAsync在等待任何事情之前,这些呼叫立即立即发生。然后,await一个接一个地编辑它们,如果其中任何一个被拒绝,这绝对是一个问题:这将导致未处理的promise拒绝错误。
使用Promise.all是处理promise数组的唯一可行选择

for (const res of await Promise.all(promises)) …

请参阅[等待多个并发的await操作](http://codingdict.com/questions/77320和[aprom
Promise.all()与多次await之间有什么区别?](http://codingdict.com/questions/77321有关详细信息。

2020-07-07