• 微任务:Promise,async/await,process.nextTick
  • dom
  • 宏任务:包括整体代码script,setTimeout,setInterval
微任务、宏任务会进入到不同的event queue。比如setTimeout和setInterval会进入相同的Event Queue。
在一个event loop,先执行微任务的queue,在执行dom,最后宏任务的queue

遇到 console 立即执行
首先会遇到setTimeout,将其放到宏任务event queue里面
然后回到 promise , new promise 会立即执行, then会分发到微任务
事件循环

console.log("1")
setTimeout(()=>{
    console.log("2")
})
new Promise((resolve) => {
   resolve()
   console.log("3")
}).then(()=>{
   console.log("4")
}).finally(()=>{
   console.log("5")
})
console.log("6")

输出
1 3 6 4 5 2


第二个例子

console.log("1");
setTimeout(() => {
  console.log("7");
  Promise.resolve().then(() => {
    console.log("9");
  });
  new Promise((resolve, reject) => {
    console.log("8");
    resolve("10");
    setTimeout(() => {
      console.log("14");
    })
  }).then((data) => {console.log(data)});
}); 
new Promise((resolve, reject) => {
  console.log("2");
  resolve("4");
  setTimeout(() => {
    console.log("11");
  })
}).then((data) => {
  console.log(data);
  setTimeout(() => {
    console.log("12");
  })
  Promise.resolve("5").then((d) => {
    console.log(d);
    Promise.resolve("6").then((d) => {
      console.log(d);
    });
  });
  setTimeout(() => {
    console.log("13");
  })
})
console.log("3");

输出:

1 2 3 4 5 6 7 8 9 10 11 12

示意图
事件循环示意图


aprildove
233 声望15 粉丝

一个前端


下一篇 »
position 属性