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

Evi*_*ian 6 javascript event-loop

我尝试理解 javascript 的事件循环,但我对fetch.

我知道的

console.log("1")
Promise.resolve(2)
    .then(data => { console.log(data) })
console.log("3")
Run Code Online (Sandbox Code Playgroud)

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

我很困惑什么

console.log("1")

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

console.log("3")
Run Code Online (Sandbox Code Playgroud)

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

如果问题在浏览器和 Node.js 中不同,我更喜欢浏览器答案。

Kai*_*ido 8

fetch方法确实会立即启动网络请求,该请求将“并行”处理,即在事件循环之外。
当收到请求响应(不是其正文,通常是标头)时,浏览器将排队一个新任务,该任务仅负责解析该 Promise,从而对其微任务进行排队。