之间有什么区别:
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?还是所有的诺言都在同一时间触发,循环的内部就像它们的回调一样?
是的,它们绝对不同。for await应该与异步迭代器一起使用,而不是与预先存在的promise数组一起使用。
for await
为了清楚起见,
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数组的唯一可行选择:
somethingAsync
await
Promise.all
for (const res of await Promise.all(promises)) …
请参阅[等待多个并发的await操作](http://codingdict.com/questions/77320和[aprom Promise.all()与多次await之间有什么区别?](http://codingdict.com/questions/77321有关详细信息。