因此,基于2个StackOverflow答案,我所理解的是:
- XHR回调与宏任务一起排队
- Fetch方法与Microtasks一起排队
所以我的问题是:
- 这是真的吗
- 如果是,为什么是这样?他们两个不应该受到同样的对待吗
这是真的吗?
否。重读你链接的答案:
当收到请求响应[…]时,浏览器将对一个新任务进行排队,该任务将只负责解决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(完成(,就处理它的主体。