谈谈你是如何理解JS异步编程的,EventLoop、消息队列都是做什么的,什么是宏任务,什么是微任务?
2020-07-22 21:20
1066 查看
1.javascript为什么是单线程?
与javascript的设计初衷有关,最早javascript是运行在浏览器中的脚本语言,目的是为了实现页面上的动态交互,实现页面的核心是dom操作,所以决定了javascript是单线程,否则会出现
线程同步的问题:
比如多个线程同时操作一个dom元素,这时浏览器不知道要以谁的操作为准,造成代码执行顺序混乱
javascript是单线程也就意味着浏览器有多个任务的时候要排队依次进行,一个一个完成,这种模式的优点是比较安全。缺点是如果我们遇到一个特别消耗时间的任务,那么后面的任务就会一直等着这个任务的完成,这样会造成页面卡死的情况,会造成阻塞。
javascript语言无法处理大量的耗时任务,为了解决这个问题,javascript讲执行任务分成了两种模式:
同步模式和
异步模式
2.同步模式
同步模式指的是我们的javascript代码要依次执行,后面的代码要等待前一句代码执行完成才能执行,排队执行,javascript代码大多数是以
同步模式进行执行的
3.异步模式
异步模式指的是我们的javascript代码
不会等待前面的代码执行完毕才开始执行。
我们将执行的代码放入到调用栈中执行,如果是同步的直接执行,如果是异步的则放入
消息队列中等待执行,等到所有的代码执行完毕,我们的
event loop就上场了,它会监听
调用栈和
消息队列中的任务,当调用栈中所有的任务结束以后,它会从
消息队列中依次取出回调函数压入到调用栈,开始执行,直到整个循环结束
4. Event Loop
主线程从
消息队列中读取事件,这个过程是循环不断的,所以整个的这种运行机制称为Event Loop(事件循环),
Event Loop是javascript的执行机制
5. 消息队列
消息队列是暂时存放异步任务的地方,我们的异步代码会存放到消息队列中,等到同步代码执行完毕以后,event loop会从消息队列中依次取出异步任务放到调用栈中再次执行。
6.宏任务,微任务
宏任务:当前调用栈中执行的代码成为宏任务,包括 主代码快 ,定时器
微任务:宏任务执行完,在下一个宏任务
开始之前需要执行的任务,可以理解为
回调函数
运行机制:
- 在执行栈中执行一个宏任务
- 执行过程中遇到微任务,将微任务添加到消息队列中
- 当前宏任务执行完毕,立即执行微任务队列中的任务
- 微任务执行完毕后,把下一个宏任务放到消息队列中,通过eventloop放到调用栈中执行。
相关文章推荐
- 谈谈你是如何理解JS异步编程的,EventLoop、消息队列都是做什么的,什么是宏任务,什么是微任务
- 如何使用NODEJS+REDIS开发一个消息队列
- 使用NODEJS+REDIS开发一个消息队列以及定时任务处理
- 新手如何快速理解js异步编程
- 深入理解FreeRTOS的任务机制和消息队列+附完整项目代码
- 一个小demo理解js的任务队列
- 任务队列,消息队列和rpc的区别是什么?
- 总结:JavaScript异步、事件循环与消息队列、微任务与宏任务
- 如何理解JS的单线程?web前端梨能起到什么作用?
- 到底什么是消息队列?Java中如何实现消息队列?
- 如何应用.NET中的消息队列服务
- RabbitMQ消息队列(三):任务分发机制
- 谈一谈JS消息机制和事件机制的理解
- 有限状态机是什么?如何使用有限状态机实现任务四?
- (十一)RabbitMQ消息队列-如何实现高可用
- js中得~~是什么意思/JS按位非(~)运算符与~~运算符的理解分析
- RabbitMQ如何保证队列里的消息99.99%被消费?
- 什么是SOA,谈谈你的SOA的理解
- hibernate中的SessionFactory,Session分别表示什么啊?如何理解?
- 【VxWorks系列】任务间同步与通信之消息队列