js异步之宏任务(marcroTask)和微任务(microTask)

本文深入剖析JavaScript中的宏任务(如setTimeout、setInterval和DOM事件)与微任务(如Promise和async/await),讲解它们的执行顺序、区别以及在解决同步异步问题中的作用。了解event loop机制,有助于提升对单线程环境下高效编程的理解。

什么是宏任务和微任务

宏任务包括:setTimeout setInterval Ajax DOM事件
微任务:Promise async/await
微任务比宏任务的执行时间要早

 

异步和单线程是相辅相成的,js是一门单线程脚本语言,所以需要异步来辅助

异步和同步的区别:

  • 异步不会阻塞程序的执行,
  • 同步会阻塞程序的执行,

前端使用异步的场景:

  1. 定时任务:setTimeout,setInverval
  2. 网络请求:ajax请求,动态<img>加载
  3. 事件绑定

 

同步异步问题
首先,你要知道javascript是单线程语言。js任务需要排队顺序执行,如果一个任务耗时过长,后边一个任务也的等着,但是,假如我们需要浏览新闻,但新闻包含的超清图片加载很慢,总不能网页一直卡着直到图片完全出来,所以将任务设计成了两类:

同步任务
异步任务
 

任务列队和event loop(事件循环) 

 单线程就意味着,所有的任务都要排队,前一个结束,才会执行后面的任务。如果列队是因为计算量大,CPU忙不过来,倒也算了。但是更多的时候,CPU是闲置的,因为IO设备处理得很慢,例如
ajax读取网络数据。js设计者便想到,主线程完全可以不管IO设备,将其挂起,然后执行后面的任务。等后面的任务结束掉,在反过头来处理挂起的任务。
 

只要主线程空了,就会读取任务列队,这就是js的运行机制,也被称为 event loop(事件循环) 

三、执行顺序 

1.主线程上宏任务、微任务执行顺序 

2.宏任务中包含微任务 

任务任务JavaScript 异步执行机制的核心组成部分,它们的调度顺序直接影响代码的执行结果性能优化[^1]。 ### 事件循环机制 事件循环通过将异步任务放入任务队列,避免主线程阻塞,实现“非阻塞”效果。其核心机制如下: - 执行栈(Call Stack):同步代码按顺序执行,形成调用栈。 - 任务队列(Task Queue):异步任务完成后,回调函数进入任务队列。 - 事件循环:主线程执行栈清空后,从任务队列中取出任务执行[^3]。 ### 任务(MacroTask) - **定义**:由宿主环境(浏览器/Node.js)提供的异步任务,每次执行一个任务。 - **常见任务**: - `setTimeout` / `setInterval` - I/O 操作(如文件读写) - UI 渲染 - 事件监听(如 click) - `setImmediate`(Node.js 特有) - `script`(整体代码)[^3] ### 任务MicroTask) - **定义**:在当前任务执行完毕后、下一个任务执行前执行的异步任务。 - **常见任务**: - `Promise.then` / `catch` / `finally` - `MutationObserver`(监听 DOM 变化) - `queueMicrotask`(现代浏览器原生 API) - `process.nextTick`(Node.js 特有,优先级最高)[^3] ### 执行顺序规则 1. 执行同步代码(任务)。 2. 执行所有任务。 3. 渲染页面(浏览器环境)。 4. 执行下一个任务5. 重复上述步骤[^3]。 ### 案例解析 ```javascript console.log("Start"); setTimeout(() => { console.log("setTimeout"); }, 0); Promise.resolve().then(() => { console.log("Promise 1"); }).then(() => { console.log("Promise 2"); }); console.log("End"); ``` 上述代码执行过程如下: 1. 执行同步代码,输出 `Start` `End`。 2. `setTimeout` 是任务,放入任务队列。 3. `Promise.resolve().then` 是任务,放入任务队列。 4. 同步代码执行完毕,执行任务队列中的任务,输出 `Promise 1` `Promise 2`。 5. 任务队列清空后,执行下一个任务,输出 `setTimeout`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值