JavaScript中的事件循环 为什么是微任务先运行

无意中看到这个问题,以下是个人的看法

1、性能和响应性: 微任务通常比宏任务执行得更快,因为微任务通常涉及更少的工作量。将微任务放在宏任务之前可以尽早执行那些需要快速响应的任务,提高系统的响应性能

2、Promise 的异步特性: 微任务常常与 Promise 相关,而 Promise 的设计目标之一是提供一种异步编程的方式。为了确保 Promise 的行为符合开发者的预期,微任务需要优先执行

3、避免死循环: 如果宏任务中产生了微任务,如果微任务不优先执行,而是等宏任务执行完再执行微任务,可能会导致宏任务和微任务之间的死循环。通过优先执行微任务,可以避免这种情况。

总体而言,微任务先执行是为了更好地管理异步任务,提高性能和响应性,并确保 Promise 的异步特性得到正确的实现。

怎么理解死循环呢,看看下面这个例子

// 宏任务
setTimeout(() => {
  console.log('宏任务开始');
  // 微任务
  Promise.resolve().then(() => {
    console.log('微任务开始');
    // 重复调用宏任务
    setTimeout(() => {
      console.log('宏任务嵌套');
    }, 0);
    console.log('微任务结束');
  });
  console.log('宏任务结束');
}, 0);

在这个例子中,当宏任务中的微任务执行时,又调度了一个新的宏任务,这样就形成了一个宏任务和微任务之间的循环。如果这个循环不受控制,可能导致无限嵌套的任务,造成死循环。

通过优先执行微任务,可以确保在宏任务之间执行微任务,从而打破潜在的死循环。如果微任务执行的时候又调度了新的宏任务,那么这个新宏任务会在当前宏任务执行完毕后被执行,而不是立即执行,从而避免了无限循环。

总的来说,“避免死循环” 是指在异步任务的处理中,合理控制任务的执行顺序,避免无限循环或递归,保证程序能够正常地执行其他任务,而不陷入无尽的重复。优先执行微任务有助于管理异步流程,避免不必要的死循环。

浅讲 Javascript

Promise.resolve().then(() => {
    console.log(0);
    return Promise.resolve(4);
}).then((res)=>{
    console.log(res)
})

Promise.resolve().then(() => {
    console.log(1);
}).then(()=>{
    console.log(2);
}).then(() =>{
    console.log(3);
}).then(() =>{
    console.log(5);
});

结果是012345

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值