当前位置:网站首页>EventLoop同步异步,宏任务微任务笔记
EventLoop同步异步,宏任务微任务笔记
2022-08-09 03:15:00 【Youser511】
EventLoop
1.JavaScript是单线程语言
JavaScript是一门单线程执行的编程语言,也就是同一个时间只能做一件事情。
问题:前一个任务非常耗时,后续的任务就不得不一直等待,导致程序假死的问题
2:同步任务和异步任务
为了防止某个耗时任务导致程序假死的问题,JavaScript 把待执行的任务分为了两类:
① 同步任务(synchronous)
又叫做非耗时任务,指的是在主线程上排队执行的那些任务
只有前一个任务执行完毕,才能执行后一个任务
② 异步任务(asynchronous)
- 又叫做耗时任务,异步任务由 JavaScript 委托给宿主环境进行执行
- 当异步任务执行完成后,会通知 JavaScript 主线程执行异步任务的回调函数

同步任务和异步任务执行过程
①同步任务由JavaScript 主线程按次序执行
②异步任务委托给宿主环境执行
③已完成的异步任务对应的回调函数,会被加入到任务队列中等待执行
④JavaScript 主线程的执行栈被清空后,会读取任务队列中的回调函数,次序执行
⑤JavaScript 主线程不断重复上面的4 步
事件循环EventLoop
JavaScript 主线程从"任务队列"中读取异步任务的回调函数,放到执行栈中依次执行,这个过程是循环不断的,所以整个的这种运行机制称为事件循环EventLoop
import thenFs from 'then-fs'
console.log("A");
thenFs.readFile('./files/1.txt', 'utf8').then(data => {
console.log("B");
})
setTimeout(() => {
console.log("C");
}, 0)
console.log("D");
结果:A D C B’
A和D属于同步任务,根据代码的先后顺序依次执行
C和B是异步任务,它们的回调函数会被加入到任务队列中,等待主线程空闲时再执行
宏任务和微任务
1什么是宏任务和微任务
JavaScript把异步任务又做了进一步的划分,异步任务又分为两类:
①宏任务
- 异步ajax请求
- setTimeout,setInterval
- 文件操作
②微任务
- Promise.then,.catch,.finally
- process.nextTick

执行顺序

先执行所有同步
所有同步执行完之后会检查是否存在待执行的微任务,如果有,则执行完所有微任务之后,再执行宏任务
每一个宏任务执行完之后,也会检查是否存在待执行的微任务,同样执行完所有微任务之后,再继续执行下一个宏任务
可以理解为每一次执行宏任务之前,都要检查执行微任务。
1:小张和小王去银行办业务,首先,需要取号之后进行排队
宏任务队列
2:假设当前银行网点只有一个柜员,小张办理存款业务,小王只能等待
单线程 宏任务按次序执行
3:小张办完存款业务后,柜员询问他是否还想办理其他业务?
当前宏任务执行完,检查是否有微任务
4:小张告诉柜员,想要买理财产品,再办个信用卡,最后兑换点纪念币
执行微任务,后续宏任务被推迟
5:小张离开柜台后,柜员开始为小王办理业务
所有微任务执行完毕,开始执行下一个宏任务
案例
setTimeout(function () {
console.log(1)
}, 70)
new Promise(function (resolve) {
console.log(2)
//ajax请求
resolve()
}).then(function () {
console.log(3)
})
console.log(4)
结果:2 4 3 1
1:先执行所有的同步任务 输出2 输出4
2:再执行微任务 输出3
3: 再执行下一个宏任务 输出1
ole.log(3)
})
console.log(4)
结果:2 4 3 1
1:先执行所有的同步任务 输出2 输出4
2:再执行微任务 输出3
3: 再执行下一个宏任务 输出1
可以试试看,下面的代码运行结果:
```js
setTimeout(function () {
console.log(1)
}, 0)
new Promise(function (resolve) {
console.log(2)
resolve()
}).then(function () {
console.log(3)
})
setTimeout(function () {
console.log(6)
},0)
console.log(4)
//24316
console.log(1);
setTimeout(function () {
console.log(2)
new Promise(function (resolve) {
console.log(3)
resolve()
}).then(function () {
console.log(4)
})
})
new Promise(function (resolve) {
console.log(5)
resolve()
})
.then(function () {
console.log(6)
})
setTimeout(() => {
new Promise(function (resolve) {
console.log(8)
resolve()
}).then(function () {
console.log(9)
})
console.log(7)
});
console.log(10);
1 5 10 6 2 3 4 7 8 9
留下一片深入文章:JavaScript 运行机制详解:再谈Event Loop
边栏推荐
- Second data CEO CAI data warming invited to jointly organize the acceleration data elements online salon
- The condition variable condition_variable implements thread synchronization
- Embedded system driver advanced [3] - __ID matching and device tree matching under platform bus driver development
- 宝塔实测-在线药店商城源码带WAP版
- Chapter 2数据分析
- 多商户商城系统功能拆解23讲-平台端分销等级
- SQL注入(1)
- 机器学习入门
- C专家编程 第9章 再论数组 9.2 为什么会发生混淆
- VMware不正常关机
猜你喜欢
随机推荐
Ingress的概念和原理
光刻机随感
JSON beautification plugin for Chrome
Celery进阶_任务优先级分配
深度学习——以天气识别为例,探讨如何保存神经网络模型
win10怎么安装.net framework 3.5?
SQL注入(4)
创建一个DAPP的全流程
C专家编程 第9章 再论数组 9.3 为什么C语言把数组形参当做指针
Hcip MPLS experiment
《基于机器视觉的高压输电线路覆冰厚度检测》论文笔记
i18n 国际化
23 Lectures on Disassembly of Multi-merchant Mall System Functions-Platform Distribution Level
126. 单词接龙 II
leetcode-23. Merge K ascending linked lists
手把手教你实现buffer(三)——接口及自动扩容
2021-07-21
新型双功能螯合剂NOTA及其衍生物CAS号:147597-66-8p-SCN-Bn-NOTA
Chrome的JSON美化插件
对线面试官实现去重和幂等






![[Network Tutorial] IPtables Official Tutorial - Study Notes 3](/img/6e/6871c590088f80d5457b4524550055.png)



