宏任务与微任务

62 阅读1分钟

前言: JS是单线程的,它运行时基于事件循环机制(event loop)

  • 调用栈,放要执行的代码
  • 任务队列,放即将要执行的代码,当调用栈中的代码执行完毕后,队列中的代码按照顺序依次进入调用栈中执行
  • 在JS中任务队列有两种
    • 宏任务队列(大部分代码都到宏任务队列中排队)
    • 微任务队列
      • (Promise的回调函数(then、catch、finally))
      • queueMicrotassk()
  • 代码执行顺序:(同>异(微>宏))
    • 先执行同步代码(在回调栈中),再执行异步代码(在任务队列中;先执行微任务队列再执行宏任务队列,下面两个例子说明:

setTimeout(()=>{
    console.log(1);
}) //进入宏观任务队列中

Promise.resolve().then(()=>{
    console.log(2);
}) //进入微任务队列
queueMicrotask(()=>{
    console.log(3);
})//进入微任务队列

//231
// 注:队列特点:先进先出
Promise.resolve().then(()=>{
    setTimeout(()=>{
        console.log(1);//1 在setTimeout函数里----挂载在宏观队列
    },0)
})

queueMicrotask(()=>{
    console.log(2);//挂载在微任务队列
})
//2 1

如果以上代码你理解啦,那就来尝试尝试分析下面这段代码:

console.log(1);

setTimeout(()=>console.log(2));

Promise.resolve().then(()=>console.log(3));

Promise.resolve().then(()=>setTimeout(()=>console.log(4)));

Promise.resolve().then(()=>console.log(5));

setTimeout(()=>console.log(6));

console.log(7);

/*
1 7 3 5 6 2 4
分析:
1,7,同步代码,先执行
3,5,6 挂在微观队列
2,4挂在宏观队列
*/