谈谈你是如何理解JS异步编程的,EventLoop、消息队列都是做什么的,什么是宏任务,什么是微任务
2020-07-19 04:12
423 查看
JS最初的设计主要的功能是对浏览器的Dom做操作的,为了方便Dom操作和便于理解,导致了JS的单线程执行机制; 由于单线程的执行机制,意味着没有线程协同处理任务,那么势必在一堆同步任务队列下,面对一些耗时的任务时, 会发生阻塞,导致处理效率不佳。
JS异步编程的首要任务就是来提高JS单线程执行机制下的处理效率的,针对一些耗时操作及宿主环境下的api交互, 例如接口的请求调用,文件的读写操作,消息发送及接收,通过异步编程的方式,都能得到很好的提升。
常用的JS异步编程的处理方式有回调函数、事件、Promise、Generator、Async Await。
EventLoop、消息队列、宏任务、微任务都是支持JS异步工作的主要内容。
在JS引擎执行一段代码的过程中,主要会经历几个阶段:
读取代码=>
压入执行栈=>
执行栈处理各个任务=>
遇到同步任务,处理完,排出执行栈,=>
遇到异步任务,执行栈处理完后,会委托宿主环境去执行任务,约定执行后,再将与这个任务的执行结果通过之前约定好的回调函数注册到消息队列=>
当执行栈的任务已经执行完成,空闲时=>
通过EventLoop会监测到,此时便将消息队列中的任务压入执行栈,逐个执行。
宏任务是消息队列里的任务,常见的接口请求、定时器等异步任务都是宏任务。
微任务是基于当前任务产生而随当前任务结束后立即执行的任务,所以也是异步任务, 但是不需要通过EventLoop监测,通过消息队列取出并压入执行栈中再执行; 像通过Promise、MutationObserver、process.nextTick产生的任务都为微任务。
相关文章推荐
- 一个小demo理解js的任务队列
- 如何使用NODEJS+REDIS开发一个消息队列
- 新手如何快速理解js异步编程
- 使用NODEJS+REDIS开发一个消息队列以及定时任务处理
- 如何理解JS的单线程?web前端梨能起到什么作用?
- 深入理解FreeRTOS的任务机制和消息队列+附完整项目代码
- 任务队列,消息队列和rpc的区别是什么?
- 到底什么是消息队列?Java中如何实现消息队列?
- 面试|ThreadPoolExecutor中的线程如何从等待队列获取任务
- 消息队列如何利用标签实现消息过滤
- 什么是SpringIOC?如何理解SpringIOC?
- 苹果多线程网络编程之-GCD队列与任务的理解
- 到底什么是权限?我们应该如何正确理解“权限定义”(请高手指点)
- 面试题剖析,如何保证消息队列的高可用?
- JS如何校验表单用户名、密码是否为空,"return false;"语句又有什么作用?
- 事件循环机制-任务队列、webAPI、JS主线程的相互协同
- redis消息队列结合简单时间轮处理任务
- 谈谈impress.js初步理解
- 简述同步和异步,以及js的任务队列.
- 大家谈谈公司里的项目经理角色及职责都是干什么的?