浏览器端与node端都有宏任务与微任务的概念。字面意思上看宏任务就是耗时间比较长的任务,而微任务是耗时短的任务。
在浏览器端,宏任务包括setTimeout,setInterval,微任务则包括Promise.then,里面的代码要异步运行。
浏览器端的运行方式为,每执行一次宏任务前,将微任务队列进行清空。
可以将首次初始化理解为一个宏任务,这样就更加便于分析js代码的执行顺序。
node中,微任务有Promise.then和process.nextTick,process.nextTick的优先级较高;宏任务则包括io操作、setInterval、setTimeout、setImmediate。
不同的宏任务被推进不同的执行栈,setInterval、setTimeout被推进timer栈,io操作被推进poll,setImmediate则被推进check,基本执行顺序是timers => poll栈 => check栈。
node端的运行方式为,每切换一次执行栈,就清空一次微任务,也就是说,将当前队列全部清空后,才会清空微任务。