在所有承诺均得到解决的假设下,异步迭代(for-await-of循环)是否比使用Promise.all
更快?
从specification on asynchronous iteration:
Each time we access the next value in the sequence, we implicitly
await
the promise returned from the iterator method.
使用异步迭代:
let pages = [fetch('/echo/json/'), fetch('/echo/html/'), fetch('/echo/xml/')]
for await (let page of pages) {
console.log(page)
}
使用Promise.all
:
let pages = await Promise.all([fetch('/echo/json/'), fetch('/echo/html/'), fetch('/echo/xml/')])
pages.forEach(page => console.log(page))
他们两个都并行获取页面,但是我想知道异步迭代是否在所有页面完成获取之前开始循环.我曾尝试在浏览器的devtools中限制网络,以模拟这种情况,但是任何差异仍然很少被注意到.
解决方法:
Is asynchronous iteration (for-await-of loop) faster than using Promise.all?
否.当最后一个承诺解决时,循环和Promise.all都将完成,大致同时.如果最后要解决的承诺是数组中的第一个承诺,则Promise.all会立即完成,而循环仍必须迭代其他元素,这可能会导致少量开销,但这无关紧要.真正重要的唯一情况是:
如果其中一个承诺被拒绝,Promise.all会立即退出,而循环必须达到该承诺.
I’m wondering if asynchronous iteration starts looping before all the pages are finished fetching.
是的,您可以早一点得到第一个结果,但是所有结果将同时可用.如果您想向用户显示数据,则使用for循环是有意义的,因为他可以在其余数据仍在获取的同时开始读取数据;但是,如果您想累积数据,则等待它们都是有意义的,因为这简化了迭代逻辑.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。