JS中的事件循环宏任务(MacroTask)和微任务(MicroTask)

js是单线程语言,问题:大家熟知单线程在运行的时候代码都是从上往下执行,那么会有代码堵塞的问题,应该如何解决?

JS在执行的时候会有同步任务和异步任务

同步任务

顺序执行,类似下面代码

    console.log("start");
    console.log("end");
    // 打印结果
    start
	end

异步任务

就是会把任务放进一个任务队列中,等同步任务执行完再来执行
异步任务有:settimeout, setInterval,ajax ,promise.then()等

注意promise不会进入异步队列,是里面的.then()才是异步任务

   console.log("start");
    setTimeout(() => {
      console.log("timeout");
    }, 0);
    console.log("end");
    // 打印结果
    start
    end
    timeout

但是,如果异步任务的promise.then()和settimeout一起运行的话,顺序应该如何?

    // console.log("start");
    // Promise.resolve().then(() => {
    //   console.log("promise");
    // });
    // setTimeout(() => {
    //   console.log("timeout");
    // }, 0);
    // console.log("end");


    console.log("start");
    setTimeout(() => {
      console.log("timeout");
    }, 0);
    Promise.resolve().then(() => {
      console.log("promise");
    });

    console.log("end");
    // 执行结果
    script start
    script end
    promise
    timeout

执行之后两次结果为什么是一样的?
是因为异步任务会通过任务队列的机制(先进先出的机制)来进行协调。
任务队列:宏任务(MacroTask)和微任务(MicroTask)
首先js代码会先执行宏任务,如果里面有微任务,就会执行微任务,否则再执行宏任务,这也可以称为事件循环(Event loop)
如图:
在这里插入图片描述

宏任务 : scrip(JS 整体代码)、setTimeout、setInterval、setImmediate、I/O、UI 交互
微任务 : Promise(重点关注)、process.nextTick(Node.js)、MutaionObserver

先解释一下上面一段代码

  1. 首先这段代码是一个宏任务,放进宏任务执行栈中
  2. 然后输出start
  3. 碰到setTimeout,放入宏任务执行栈中
  4. 碰到Promise.then()放进微任务中
  5. 输出end
  6. 因为整个script是一个宏任务,然后判断任务队列中的微任务,就会输出promise
  7. 最后输入第二个宏任务timeout

总结:
— 最后的最后,记住,JavaScript 是一门单线程语言,异步操作都是放到事件循环队列里面,等待主执行栈来执行的,并没有专门的异步执行线程。

本文参考自一次搞懂-JS事件循环之宏任务和微任务

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值