微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

javascript-Promise.all和等待状态的性能

在所有承诺均得到解决的假设下,异步迭代(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] 举报,一经查实,本站将立刻删除。

相关推荐