# 宏任务和微任务

# 一段代码

console.log('script start');

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

Promise.resolve()
  .then(function () {
    console.log('promise1');
  })
  .then(function () {
    console.log('promise2');
  });

console.log('script end');

这段代码的输出如下:

// script start
// script end
// promise1
// promise2
// setTimeout

在编译期间已经把代码分成了同步代码、宏任务、微任务

同步代码:

console.log('script start');
console.log('script end');

宏任务:

console.log('setTimeout');

微任务:

console.log('promise1');
console.log('promise2');

浏览器执行顺序:同步代码 -> 微任务 -> 宏任务

# 不同的是

注意下面的输出会不一样

console.log('1'); // 宏任务 同步

setTimeout(function() {
    console.log('2'); // 宏任务 异步
})

new Promise(function(resolve) { // 这个是定义
    console.log('3'); // 宏任务 同步
    resolve();
}).then(function() {
    console.log('4') // 微任务
})

console.log('5') // 宏任务 同步
1
3
5
4
2

宏任务:

浏览器 nodejs
UI render
I/O
setTimeout
setInterval
RequestAnimationFrame ×
setImmediate ×

微任务:

浏览器 nodejs
Process.nextTick ×
Promise
MutationObserver ×