运行下面的示例,您将看到 setTimeout 回调总是在 Promise 回调之后执行。是否有任何机制导致此结果?还是这不是真的?
setTimeout(function() {
console.log(1)
}, 0)
new Promise(function (resolve, reject) {
resolve(2)
}).then(console.log)
setTimeout(function() {
console.log(3)
}, 0)
new Promise(function (resolve, reject) {
resolve(4)
}).then(console.log)
console.log('rush...')
答案 0 :(得分:3)
本机承诺被安排为微任务。当前执行堆栈完成后,将首先运行微任务,然后再执行常规任务。
有关事件循环的更多信息,包括有关微任务的信息,我推荐此演示文稿:https://www.youtube.com/watch?v=cCOL7MC4Pl0。微任务部分从24分钟开始。
答案 1 :(得分:0)
这是正常的,因为 Javascript是单线程的,并考虑了如何编写代码,而setTimeout是异步的(之后,脚本是在加载脚本时)以同步方式执行的。脚本已加载)。