您的位置:首页 > Web前端 > JavaScript

谈谈你是如何理解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产生的任务都为微任务。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: