setTimeout比Promise晚

时间:2018-08-24 23:38:31

标签: javascript asynchronous promise

运行下面的示例,您将看到 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...')

2 个答案:

答案 0 :(得分:3)

本机承诺被安排为微任务。当前执行堆栈完成后,将首先运行微任务,然后再执行常规任务。

有关事件循环的更多信息,包括有关微任务的信息,我推荐此演示文稿:https://www.youtube.com/watch?v=cCOL7MC4Pl0。微任务部分从24分钟开始。

答案 1 :(得分:0)

这是正常的,因为 Javascript是单线程的,并考虑了如何编写代码,而setTimeout是异步的(之后,脚本是在加载脚本时)以同步方式执行的。脚本已加载)。