宏任务: setTimeout, setInterval, setImmediate, I/O, UI rendering
微任务: Promises.(then catch finally), process.nextTick, MutationObserver
进入一个代码块,无论setTimeout在哪一行,都会最后执行。而多个setTimeout,位于前面的先执行
js引擎执行时,必须先把代码块的同步代码执行完毕,才考虑是否执行异步队列的任务代码,
每次执行完同步代码,必先查询一个异步队列里面是否含有微任务,如果有先把微任务依次执行完,后再去执行宏任务。
setTimeout(() => console.log(1))
new Promise((resolve) => {
resolve()
console.log(2)
}).then(() => {
console.log(3)
})
console.log(4)
结果是 2 4 3 1
setTimeout Promises 当代码块,含有 setTimeout 和 Promises,先执行Promises同步操作,第二执行常规同步代码,再执行Promises.then(),最后执行setTimeout