javascript - 在 Chrome 中执行 fetch() 和 setTimeout() 的优先级

标签 javascript asynchronous promise fetch settimeout

根据我对事件循环的理解,以下代码将首先输出“Sync 2”,然后是“Sync 4”(同步代码),然后是“Promise 3”(fetch 返回一个 Promise,它将被放置在微任务队列中,并且将在同步代码完成并且数据从 API 返回后执行),最后是“Async 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')

最佳答案

您的 fetch 调用必须至少进入浏览器缓存并可能进入网络(以重新验证缓存中的内容),因此您根本无法对调用时间做出任何假设到你的履行处理程序,除了它不会同步。履行处理程序调用可能会立即排队(尽管我倾向于怀疑),在这种情况下,它会在下一个任务(setTimeout 回调)之前运行,但更有可能至少会被暂停简要地。从根本上说,这取决于浏览器中 fetch 的实现,它依赖于实现,与任务或微任务无关。

关于javascript - 在 Chrome 中执行 fetch() 和 setTimeout() 的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61890737/

相关文章:

javascript - 在选择框/下拉列表中仅显示唯一值

javascript - Backbone.js 使用集合渲染 View

javascript - 在 Javascript/Node.Js 中设置 Watson Speech to Text API 时出现问题

javascript - jQuery 检查文件扩展名在 IE 中不起作用

python - 在 asyncio 应用程序中将 CPU 密集型任务作为单独的进程运行会导致速度显着减慢

Javascript 'confirm()' 取消回发

javascript - 当 Promise 被拒绝时,Promise 按顺序不会停止

typescript - 为什么我必须调用 NgZone.run 让我的 View 在 Angular2 中使用 breezejs 进行更新?

javascript - 将 async/await 与 forEach 循环结合使用

javascript - react - 如何强制元素立即重绘