【发布时间】:2020-05-19 20:14:16
【问题描述】:
根据我对事件循环的理解,以下代码将首先输出“Sync 2”,然后是“Sync 4”(同步代码),然后是“Promise 3”(fetch 返回一个 Promise,该 Promise 将被放入微任务队列和将在同步代码完成并且数据从 API 返回后执行),最后是“异步 1”(setTimeout 将被放置在优先级最低的宏任务/回调队列中)。
但是,在最新版本的 Chrome 中,如果我将 setTimeout() 设置为 0,如下所示,我总是在“Promise 3”之前得到“Async 1”。我有什么误解吗?是否有可能一个尚未解决的 Promise 的优先级低于此处的宏任务队列中的某些内容?
setTimeout(() => console.log('Async 1'), 0);
console.log('Sync 2')
fetch('https://api.github.com/repos/javascript-tutorial/en.javascript.info/commits').then(() => console.log('Promise 3'))
console.log('Sync 4')
【问题讨论】:
-
顺序取决于获取实际需要多长时间 - settimeout 为 0 不会等待获取完成 - 微任务(承诺)队列处理 Promise,而不是网络请求
标签: javascript asynchronous promise fetch settimeout