为什么XHR请求被视为宏任务,而Fetch请求则被视为微任务



因此,基于2个StackOverflow答案,我所理解的是:

  1. XHR回调与宏任务一起排队
  2. Fetch方法与Microtasks一起排队

所以我的问题是:

  1. 这是真的吗
  2. 如果是,为什么是这样?他们两个不应该受到同样的对待吗

这是真的吗?

否。重读你链接的答案:

当收到请求响应[…]时,浏览器将对一个新任务进行排队,该任务将只负责解决Promise,[…]

我已经为您强调了宏任务。

难道不应该以同样的方式对待他们吗?

不,他们为什么要这样做?一个是承诺API,另一个不是。请注意,如果将XMLHttpRequest封装在promise中,则会得到完全相同的行为:load/readystatechange事件(宏任务(解析promise,调度任何promise处理程序(微任务(。

但最终你应该问问自己:这有关系吗?你通常不需要关心这样的时间细节。

这是真的吗?

是。

创建XMLHttpRequest时,没有微任务队列。只有一个-现在称为宏任务队列。

然而,当fetch()被引入时,承诺已经在标准中了。fetch()的结果是promise,promise解析后的所有效果都是通过微任务队列完成的:

setTimeout(() => console.log("macrotask done"), 0);          //logged second
Promise.resolve().then(() => console.log("microtask done")); //logged first

因此,从fetch()解析promise也将向微任务队列添加后续处理程序。同样,它是用于处理程序all promise的一个。

如果是,为什么会这样?他们两个不应该受到同样的对待吗?

不要求两者工作相同。这些问题的解决也不会对日常代码产生太大的实际影响。

请注意,这两者实际上并不相同,在读取结果正文之前,一旦返回结果,fetch就会立即解析。因此,为什么需要调用.json().text(),请参阅why.json((返回promise?-调用那些将实际处理正文的方法。XHR不需要这个中间步骤,一旦它处于就绪状态4(完成(,就处理它的主体。

最新更新