macrotask在一些文章中也被直接称为task。
一个宿主环境只有一个事件循环,但可以有多个任务队列。宏任务队列(macro task)与微任务队列(micro task)就是其中之二。
每次事件循环的时候,微任务优先级高于宏任务。
宏任务:script(全局任务), setTimeout, setInterval, setImmediate, postMessage, MessageChannel, I/O, UI rendering.
微任务:process.nextTick, Promise, Object.observer, MutationObserver.
微任务总 process.nextTick > promise.then
宏任务中,通常 setTimeout > setImmediate
setImmediate(): 是被设计用来一旦当前阶段的任务执行完后执行。
setTimeout(): 是让代码延迟执行。
如果没有在一个I/O周期执行,那么其执行顺序是不确定的。
如果在一个I/O周期执行,setImmediate总是优先于setTimeout执行。
更多请查看Jake Archibald关于macroTask和microTask的说明
https://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/