event loop机制/什么是微任务/什么是宏任务?二者什么区别/手写Promise使用

文章详细解释了JavaScript中的EventLoop机制,包括同步代码的执行、异步操作如何被处理以及微任务和宏任务的区别。微任务如Promise和async/await会在宏任务(如setTimeout)之前执行。通过示例展示了Promise的使用,以及如何避免回调地狱。最后提到了async函数与Promise的关系及其执行顺序。
摘要由CSDN通过智能技术生成

Even Loop机制

1、执行所有的同步代码,一行行放在Call Stack(调用栈)中执行

2、遇到异步,会先“记录”下代码,等待执行时机(setTimeout Ajax),时机到了,将之前“记录”的代码放入callback Queue(回调函数队列里)

3、当call Stack为空(同步代码执行完),EventLoop开始工作

4、EvenLoop轮询查找 callback Queue中是否有执行的代码,如果有,将代码移入到Call Stack中执行

5、Even Loop 如果没有找到可以执行的代码,则会继续轮询查找

什么是微任务

微任务:Promise、async await

宏任务:setTimeout setInterval、Ajax、DOM事件

二者区别

先执行微任务,再执行宏任务

例:

    console.log("start");
    setTimeout(() => {
      console.log("setTimeout");
    }, 2000);
    Promise.resolve().then(()=>{
      console.log("promise");
    })
    console.log("end");
//控制台: 
 start
 end
 promise
 setTimeout

解析:js的代码的执行顺序从上至下、从左至右的;先执行所有的同步打代码、再执行异步代码,

所以先输入start、end,然后再执行微任务,再执行宏任务

同步代码-》微任务-》渲染Dom-》宏任务

微任务、宏任务、Dom渲染的关系

1、call stack清空,触发Even Loop

2、执行微任务

3、DOM渲染

4、执行宏任务

Promise使用

回调地狱:下一次网络请求依赖上一次请求数据的,这样嵌套形成回调地狱,解决回调地狱的方法是promise

    // proise使用
    const Op = new Promise((resolve,reject)=>{
      // 异步操作成功的话调用resolve,异步操作失败的时候调用reject
      //reject、resole传参数
      setTimeout(()=>{
           reject()
      },1000)
    });
    //传入个函数,做相应操作
    Op.then(()=>{
      console.log("then");

    }).catch(
      ()=>{
         console.log("catch");
      }
    )
手写promise加载图片
    function loadImg(src) {
      return new Promise((resolve, reject) => {
        const oImg = new Image();
        oImg.src = src;
        oImg.onload = () => {
          resolve(oImg);
        };
        oImg.onerror = () => {
          resolve("图片加载失败");
        };
      });
    }
    //这个函数自动加载图片
    loadImg("https://robohash.org/1")
      .then((oImg) => {
        document.body.appendChild(oImg);
        return loadImg("https://robohash.org/2");
      }) //第一张图片加载完成再加载第二张图片
      .then((oImg) => {
        document.body.appendChild(oImg);
        return loadImg("https://robohash.org/3");
      })
      .then((oImg) => {
        document.body.appendChild(oImg);
      })
      .catch((errsg) => {
        console.log(errsg);
      });
  },

promise是async、await的语法糖

    function loadImg(src) {
      return new Promise((resolve, reject) => {
        const oImg = new Image();
        oImg.src = src;
        oImg.onload = () => {
          resolve(oImg);
        };
        oImg.onerror = () => {
          resolve("图片加载失败");
        };
      });
    }
    (async function(){
      try{
          const oImg =  await loadImg("https://robohash.org/1")  //不知道什么时候返回 外面套async函数
           document.body.appendChild(oImg);
                  const oImg2 =  await loadImg("https://robohash.org/2")  //不知道什么时候返回 外面套async函数
           document.body.appendChild(oImg2);
      }catch(error){
        console.log(error);
      }
        
    })()

考点1:then和catch内部没有throw new Error,相当于resolve

考点2:async function 相当于返回一个promise.resolve

    async function fn1(){
      console.log("fn1 start");
      await fn2(); //调用f2 await后面的代码是异步代码
      console.log("fn1 end");
    }
    async function fn2(){
      console.log("fn2 start");
    }
    console.log("start");
    fn1()
    console.log("end");
    // start
    // fn1 start
    // fn2 start
    // end
    //fn1 end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值