Web API Fetch() 是并行的还是异步的?

Posted

技术标签:

【中文标题】Web API Fetch() 是并行的还是异步的?【英文标题】:Is Web API:S Fetch() parallell or async? 【发布时间】:2022-01-10 10:28:00 【问题描述】:

我很难找到这个问题的答案。 当我们调用 fetch() 时,浏览器是打开了一个新线程还是调用只是放在了微队列中?

【问题讨论】:

并行异步的。然而,并非所有异步都是并行的。 操作本身是异步的。不要将并发性与并行性混淆。 【参考方案1】:

答案是“两者兼而有之”:

网络请求本身与您的 javascript 线程上发生的任何其他事情并行处理,而不是在 JavaScript 线程上。 (在所有主流浏览器中。)

当网络请求完成时,一个承诺反应(履行或拒绝)会排队等待 JavaScript 线程在下一次检查相关队列时获取。 (我认为会发生什么情况是浏览器将完成承诺的任务排入队列,该任务又将任何相关的承诺反应排入微任务队列中。不过,细节并不重要;从根本上说,一次网络请求完成,任务/微任务在某处排队等待任何需要发生的承诺反应,并像其他任务/微任务一样被 JavaScript 线程拾取。)

【讨论】:

我觉得这真的只是一种答案。第二部分发生在所有基于 Promise 的异步任务中。对于fetch 来说,这并不是什么特别的事情。 OP 似乎使事情变得混乱,因为问题读起来像“Lassie 是狗还是动物?” @VLAZ - 也许吧。由于第一部分,我认为第二部分是相关的。不是每个人都知道 JavaScript 的 run-to-completion 语义,所以可以想象这样一种情况,一旦并行工作完成,无论 JavaScript 代码正在做什么,都可能会在中间暂停,并且 Promise 反应处理。正如你和我所知,这不是发生的事情。 :-) @VLAZ 是的,所以我只是想知道网络调用本身是放在微队列中开始的,还是开始在不同的线程中并行运行,然后放在微队列中。 :) @AlfredOdling - 网络任务可能会被放入 some 队列(供浏览器的网络部分处理,因为它们只允许 X 数量的并发网络操作) ,但不是与 JavaScript 相关的。 :-)

以上是关于Web API Fetch() 是并行的还是异步的?的主要内容,如果未能解决你的问题,请参考以下文章

js fetch处理异步请求

[转] 学会fetch的用法

Ajax新玩法fetch API

简单的了解下 Fetch API 的工作原理

使用 fetch 在节点中进行异步 api 调用的最佳实践?

JS fetch API:如何使用一个异步函数从多个文件中获取内容?