York's Blog

MacroTask v.s. MicroTask

妈(Ma)咪 (Mi)
MacroTask(宏任务)
MicroTask(微任务)
通过Event Loop实现

  • macrotasks 有 setTimeout setInterval setImmediate I/O UI渲染
  • microtasks 有 Promise process.nextTick Object.observe MutationObserver
  1. 先执行 Ma 再执行 Mi。宏任务和微任务轮流执行,Mi任务每次都清空
  2. new Promise(fn).then(success) 期中 fn 是立即执行的,success 会被放入 Mi 任务。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
console.log('script start');

setTimeout(function() {
console.log('setTimeout');
}, 0);

let promise = new Promise((resolve, reject)=>{
console.log(1)
resolve()
})
promise.then(function() {
console.log('promise1');
}).then(function() {
console.log('promise2');
});

console.log('script end')

log 的顺序。
script start
1
script end
promise1
promise2
Promise {<resolved>: undefined}
setTimeout
Proudly published with Hexo