fetch 对浏览器中的事件循环有什么作用?

What does fetch do with event loop in browser?

我试图理解javascript的事件循环,但我对fetch感到困惑。

我所知道的

console.log("1")
Promise.resolve(2)
    .then(data => { console.log(data) })
console.log("3")

以上代码执行结果为:1,3,2。由于在第一个事件循环中,引擎执行日志1,解析2,将then块放入微任务队列,日志3,然后搜索微任务队列并执行日志数据。

我很困惑

console.log("1")

fetch("some-url")
    .then(data => { console.log(data) })

console.log("3")

引擎执行日志1后,做了什么?它会立即执行 HTTP 请求吗?如果是这样,它是否将 then 块放入微任务队列?我认为它可能不会将 then 块放入微任务队列,因为当当前队列为空并且引擎开始获取微任务队列时,它获取的数据可能尚未准备好。那么then块是如何进入微任务队列的呢?引擎是否向内核发出回调,告诉它在响应准备好时将 then 块放入微任务队列?

如果问题在浏览器和 node.js 中有所不同,我更喜欢浏览器的回答。

fetch 方法确实会立即启动网络请求,该请求将“并行”处理,即在事件循环之外。
当收到请求响应时(不是它的 body,通常是 headers),浏览器 will queue a new task which will only be responsible of resolving that Promise, and thus of queuing its microtask.