宏任务和微任务

2021-06-28  本文已影响0人  RadishHuang

浏览器是多线程执行代码,渲染的。但是浏览器只给JS一个线程来执行,因此JS是单线程。因此代码都是同步执行的,但是JS也有异步的任务,比如settimeout,async,await。这些都是异步的任务。因此引出宏任务和微任务,这两个都是异步任务。

async  function  async1 ()  {
    console.log('async1 start');
    await  async2();
    console.log('async1 end')
}
async  function  async2 ()  {
    console.log('async2')
}
console.log('script start');
setTimeout(function ()  {
    console.log('setTimeout')
},  0);
async1();
new  Promise(function (resolve)  {
    console.log('promise1');
    resolve()
}).then(function ()  {
    console.log('promise2')
});
console.log('script end')
执行流程

第二道示范代码,注意宏任务跟微任务都要执行的时候,微任务优先。

setTimeout(() => {
  console.log("time1");
  setTimeout(() => {
    console.log("time3");
  }, 0);
  new Promise((resolve) => {
    resolve();
    console.log("new resolve");
  }).then(() => {
    console.log("Promise then");
  });
}, 0);
setTimeout(() => {
  console.log("time2");
}, 0);
console.log("mian");

留下题目



console.log('==== start ====')
setTimeout(function () {
  console.log('定时器')
  setTimeout(function () {
    console.log('定时器中的定时器')
  }, 0)
  new Promise(function (resolve) {
    console.log('准备执行 for 循环111')
    for (let i = 0; i < 666; i++) {
      i == 5 && resolve()
    }
  }).then(function () {
    console.log('执行了 then 方法1111')
  })

}, 0)
console.log('==== end ====')
new Promise(function (resolve) {
  console.log('准备执行 for 循环222')
  for (let i = 0; i < 666; i++) {
    i == 5 && resolve()
  }
}).then(function () {
  console.log('执行了 then 方法2222')
})

不能被resolve混淆了。先执行first()。然后才是then进入微任务。因此first()方法里面的p.then微任务更先进。



const first = () => (
  new Promise((resolve, reject) => {
    console.log(3);
    resolve(2);
    let p = new Promise((resolve, reject) => {
      console.log(7);
      setTimeout(()=>{
        console.log(5);
        resolve(6);
      }, 0)
      resolve(1);
    })
    p.then((arg) => {
      console.log(arg);
    })
  })
)

first().then((arg)=>{
  console.log(arg);
})
console.log(4);
上一篇下一篇

猜你喜欢

热点阅读