rin*_*t.6 7 javascript asynchronous promise async-await
在所有承诺都解决的假设下,异步迭代(for-await-of循环)是否比使用Promise.all?
从异步迭代规范:
每次我们访问序列中的下一个值时,我们都会隐式地
await从迭代器方法中返回promise。
使用异步迭代:
let pages = [fetch('/echo/json/'), fetch('/echo/html/'), fetch('/echo/xml/')]
for await (let page of pages) {
console.log(page)
}
Run Code Online (Sandbox Code Playgroud)
使用Promise.all:
let pages = await Promise.all([fetch('/echo/json/'), fetch('/echo/html/'), fetch('/echo/xml/')])
pages.forEach(page => console.log(page))
Run Code Online (Sandbox Code Playgroud)
它们都并行获取页面,但我想知道异步迭代是否在所有页面完成获取之前开始循环。我曾尝试在浏览器的 devtools 中限制网络来模拟这一点,但任何差异仍然太小而无法注意到。
异步迭代(for-await-of 循环)是否比使用 Promise.all 更快?
不。当最后一个承诺解决时,循环和 Promise.all 都将完成,这将大致同时完成。如果解决的最后一个承诺是数组中的第一个承诺,那么 Promise.all 会立即完成,而循环仍然必须迭代其他元素,这可能会导致少量开销,但这应该无关紧要。唯一真正重要的情况是:
如果其中一个承诺被拒绝, Promise.all 立即退出,而循环必须达到该承诺。
我想知道异步迭代是否在所有页面完成提取之前开始循环。
是的,您可以早一点获得第一个结果,但所有结果将同时可用。如果您想向用户显示数据,使用 for 循环是有意义的,因为他可以在其余部分仍在获取时开始阅读,但是如果您想累积数据,那么等待它们是有意义的,因为它简化了迭代逻辑。