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.
我试图理解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.