异步操作中的宏任务(macrotasks)与微任务(microtasks)

 JS是单线程的运行机制; js的程序代码可以分为同步任务和异步任务,对于同步的任务,当然按照顺序执行,但是对于异步的操作,会有一个优先级的执行顺序,分别为宏任务和微任务

1 宏任务有哪些

宏任务本质:参与了事件循环的任务;即会被添加到任务队列

 

2 微任务有哪些

微任务本质:直接在 Javascript 引擎中的执行的,没有参与事件循环的任务。当成普通的回调理解即可

3 根据代码分析

任务队列是一种数据结构,可以存放要执行的任务。它符合队列“先进先出”的特点,也就是说要添加任务的话,添加到队列的尾部;要取出任务的话,从队列头部去取。

如上输出结果会是什么呢?

让我们分析一下

首先明确并列层面的执行顺序:同步主线程->微任务->宏任务

可以看到有并列的四个任务:

1 宏任务, 直接加到任务队列,先不执行

2 同步主线程,直接执行;输出 “2”

3 微任务,先不执行,因为后面有一个同步主线程

4 同步主线程,直接执行;输出 "4"

然后执行第三步的微任务(当成回调理解,不会像宏任务被添加到异步任务队列);输出"3",

最后将任务队列中的宏任务拿出来执行;输出"1"

所以准确结果是:2 4 3 1

4 再看一个例子

1 宏任务;直接扔到任务队列等着;

2 同步主线程;直接执行;输出 "2" ;

3 微任务;先暂时挂起来;因为是promise的回调嘛

4 同步主线程;直接执行;输出"4"

     (1) 然后执行第三步的微任务的回调结果;输出"3"

     (2) 没有其他主线程或者微任务后;将异步队列中的任务,从头到尾拿到主线程执行;把宏任务1里面的程序展开到主线程中开始执行;

5 同步主线程;直接执行;输出"1"

6 宏任务;直接扔到任务队列等着;

7 同步主线程;直接执行;输出 "6";

8 微任务;先暂时挂起来;因为是promise的回调嘛;

后面没有主程序的任务了;所以继续如下:

    (1) 执行挂起来的微任务,里面是同步主线程,输出"7"

    (2) 微任务也没有了,从异步队列中拿出放进去的第5步的宏任务

    (3) 里面是同步主线程,直接执行;输出"5"

所以结果是 2 4 3 1 6 7 5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨大大28

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值