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

问题描述 投票:2回答:2

根据我对事件循环的理解,以下代码将先输出“ Sync 2”,然后输出“ Sync 4”(同步代码),然后输出“ Promise 3”(获取返回的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')
javascript asynchronous promise fetch settimeout
2个回答
1
投票

您的fetch调用必须至少转到浏览器缓存,甚至可能要转到网络(以重新验证缓存中的某些内容),因此您完全不能对在其上的实现处理程序的调用时间进行任何假设。除此之外,它不会是同步的。履行处理程序调用可能会立即排队(尽管我会对此产生怀疑),在这种情况下,它将在下一个任务(setTimeout回调)之前运行,但更有可能至少被暂时搁置。从根本上讲,这取决于浏览器中fetch的实现,这取决于实现,与任务或微任务无关。


1
投票

(获取将返回一个Promise,该Promise将放置在微任务队列中,并在同步代码完成并且数据从API返回后执行。)>

仅当返回的承诺立即解决]时才为真,例如,使用Promise.resolve。如果fetch返回的Promise立即解决,那么您将是对的,并且Promise 3将在setTimeout之前记录。

但是fetch不会立即解决-它要求端点先响应,这需要一段时间

,因此您首先会看到setTimeout日志。
© www.soinside.com 2019 - 2024. All rights reserved.