美文网首页
宏任务和微任务有什么区别

宏任务和微任务有什么区别

作者: ZH彪 | 来源:发表于2021-06-28 09:56 被阅读0次

微任务和宏任务皆为异步任务,它们都属于一个队列,主要区别在于他们的执行顺序,Event Loop的走向和取值

宏任务和微任务的一些分配

宏任务                浏览器          Node
I/O               ✅  ✅
setTimeout        ✅  ✅
setInterval        ✅  ✅
setImmediate           ❌  ✅
requestAnimationFrame                ✅  ✅ 

         微任务
process.nextTick              ❌  ✅
MutationObserver              ✅  ❌
Promise.then catch finally                  ✅  ✅

宏任务与微任务之间的执行顺序(同步任务->微任务->宏任务)
下面说说执行到宏任务后是怎么继续运行的
(这里声明下,整段js代码就是第一个大的宏任务,事件循环是由这第一个宏任务开始的,然后分出微任务,这里是为了理解微任务宏任务的执行区别就先跳过这第一层)

说一个很有名的银行例子:银行柜台前排着一条队伍,都是存钱的人,存钱属于宏任务,这条队伍就是宏任务队列,当一个‘宏大爷’被叫到了自己的号码,就上前去--被处理,处理存钱业务时,‘宏大爷’突然想给自己的存款办个微理财(微任务),那么银行职员就将他的需求添加到自己的微任务队列,大爷就不用再排队了,直接在存钱宏任务进行完后就处理衍生出来的微任务理财,办理财时大爷又说办个信用卡,那就又排到微任务队列里。但要是在此次存钱时‘宏大爷’说他还要存钱,且是他老伴要存钱,也是宏任务,但不好意思,需要取号到宏任务队列的后面排队(这里就是在宏任务进行时产生微任务和宏任务的处理方式)。

图片

结合下面的题目理解理解(这里先不介绍node环境的事件循环的特殊地方,主要以浏览器环境):

<script> 
setTimeout(function () {//宏任务1
      console.log('1');
    });
    new Promise(function (resolve) {
      console.log('2');//同步任务1
      resolve();
    }).then(function () {//微任务1
      console.log('3');
    });
    console.log('4');//同步任务2
    setTimeout(function () {//宏任务2
      console.log('5');//宏任务2中的同步任务
      new Promise(function (resolve) {
        console.log('6');//宏任务2中的同步任务
        new Promise(function (resolve) {//宏任务2中的微任务
            console.log('x1');
            resolve();
          }).then(function () {
            console.log('X2');
          });
        setTimeout(function () {//宏任务2中的宏任务
          console.log('X3');
          new Promise(function (resolve) {//宏任务2中的宏任务中的同步任务
            console.log('X4');
            resolve();
          }).then(function () {//宏任务2中的宏任务中的微任务
            console.log('X5');
          });
        })
        resolve();
      }).then(function () {//宏任务2中的微任务
        console.log('7');
      });
    })
    setTimeout(function () {//宏任务3
      console.log('8');
    });
    //(对于这段代码node环境和浏览器环境输出一致)
    //输出答案:2,4,3,1,5,6,x1,x2,7,8,x3,x4,x5
</script>

相关文章

  • 宏任务和微任务有什么区别

    微任务和宏任务皆为异步任务,它们都属于一个队列,主要区别在于他们的执行顺序,Event Loop的走向和取值。 宏...

  • 微任务和宏任务@小四@王云飞

    微任务和宏任务 微任务 和 宏任务 表示异步任务的两种分类。 微任务(microtask)和宏任务(macrota...

  • 前端面试题

    1.宏任务和微任务 宏任务:宏任务队列可以有多个 setTimeout() , setInterval , scr...

  • 宏任务和微任务

    [js 宏任务和微任务] .宏任务(macrotask )和微任务(microtask ) macrotask 和...

  • 宏任务 和 微任务

    宏任务: 当前调用栈执行的代码成为宏任务,(主代码块和定时器)也或者宿主环境提供的叫宏任务 这些任务包括: 渲染事...

  • 宏任务和微任务

    介绍这个之前, 建议先了解一下事件循环[https://www.jianshu.com/p/106867eee55...

  • 宏任务和微任务

    浏览器是多线程执行代码,渲染的。但是浏览器只给JS一个线程来执行,因此JS是单线程。因此代码都是同步执行的,但是J...

  • # 宏任务和微任务

    首先说明 首先在JavaScript中,有同步代码和异步代码.这点很清晰. 代码的执行优先级顺序是,同步代码执行优...

  • 微任务和宏任务

    JS是单线程的,可以把这个线程叫做主线程,主线程中包含宏任务队列和微任务队列,宏任务所在的队列就叫宏任务队列,微任...

  • 宏任务和微任务

    所谓微任务和宏任务 宏任务::常见的定时器,用户交互事件等等。可以理解是每次执行栈执行的代码就是一个宏任务。(宏任...

网友评论

      本文标题:宏任务和微任务有什么区别

      本文链接:https://www.haomeiwen.com/subject/dfqqultx.html