gpt4 book ai didi

javascript - 循环时await 调用会并行执行吗?

转载 作者:行者123 更新时间:2023-12-02 22:22:31 24 4
gpt4 key购买 nike

假设我们的外观是这样的:

documents.forEach(url=>{
await fetch(url).
then(
document=>
console.log(document);
}

这会并行加载所有文档,还是会串行加载文档?

换句话说,我们可以将 fetch promise 推送到一个数组中,然后在该数组上调用 Promise.all ,这将并行执行所有 promise 。

IIUC 实际上没有什么区别,除了 Promise.all 将在 fetch 请求第一次失败时失败。

最佳答案

如果回调函数声明为async,则可以使用await:

documents.forEach(async url => {
await fetch(url).then(console.log);
}

执行顺序如下:

  1. 执行forEach方法。
  2. 这包括为每个 url 调用回调,该回调依次发生
  3. 回调的一次执行将调用 fetch,这将启动 HTTP 请求并立即返回并带有一个 promise 。在后台,非 JavaScript、较低级别的 API 轮询传入的 HTTP 响应。只有后台部分与此处描述的步骤并行发生。
  4. 执行then方法并注册传递给它的回调。 then 方法立即返回一个 Promise
  5. await 启动:回调函数的执行上下文被保存并退出,返回此代码忽略的 promise 。
  6. 进行下一次迭代,从第 3 步开始重复。
  7. forEach 方法结束。在此阶段,有多个非 JavaScript 线程轮询 HTTP 响应,并且有多个 JS 执行上下文等待稍后执行。
  8. 以某种不可预测的顺序(取决于提供响应的服务器的响应时间),fetch API 解析它返回的 Promise,并将一条消息放入 Promise 作业队列中以指示那个。
  9. JavaScript 事件循环检测事件并继续执行步骤 4 中注册的回调(then 回调),输出到控制台。 then 方法返回的 Promise 已解析,这会将新消息放入 Promise 作业队列中。
  10. 从队列中提取消息,这将恢复 forEach 回调的相应执行上下文。 await 之后继续执行,并且由于没有更多内容要执行,因此第 5 步中返回的 Promise 已解决(但没有人监听)
  11. JavaScript 会监视事件队列以进行更多此类工作,并在某个时候重复第 8 步。

这里没有 JavaScript 代码与 JavaScript 并行执行,但是 fetch API 依赖于非 JavaScript 代码,“深入”到操作系统函数,这些函数确实运行与 JavaScript 代码(和其他操作系统功能)并行。

另请注意,代码与此非 async/await 变体非常相似:

documents.forEach(url =>
fetch(url).then(console.log)
);

...因为此回调返回一个 promise 。除了这里没有发生“保存执行上下文”部分之外,执行计划非常相似。

关于javascript - 循环时await 调用会并行执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59182802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com