写点什么

谈谈你是如何理解 JS 异步编程的,EventLoop、消息队列都是做什么 ,什么是宏任务,什么是微任务?

用户头像
GKNick
关注
发布于: 2020 年 07 月 19 日
  1. 为什么会产生JS异步编程?

JS最初设计的主要功能是对浏览器的DOM进行操作,为了方便操作DOM以及理解,才使得JS是单线程;但是由于这种机制,所有的任务都必须在一堆同步任务队列下,一个一个按照顺序执行,在执行一些耗时的任务时,就会发生阻塞,影响效率,在这种前提下才会出现JS异步编程。

JS异步编程的主要任务就是为了提高JS单线程执行机制下的工作效率的。针对一些耗时的操作,比如说接口的请求调用,文件的读写操作,消息发送和接收等,利用异步编程的方式,我们可以很好的提升效率。

  1. EventLoop、消息队列都是做什么的?



JS引擎执行一段代码的过程,一般都会经历如下几个过程:

  • 读取JS代码

  • 将代码压入执行栈

  • 处理执行栈的各个任务

  • 如果是同步任务,处理结束,排出执行栈

  • 如果是异步任务,执行栈处理完成后,会委托宿主环境去执行任务,执行完后,再把这个任务的执行结果通过回调函数注册到消息队列中。

  • 当执行栈的任务已经全部执行完毕,执行栈已空时,JS就会通过EventLoop事件监听去监测消息队列,将消息队列中的任务压入执行栈按压入顺序执行。

eventLoop:

  • JS引擎线程会维护一个执行栈,同步代码会依次加入到执行栈中执行并出栈;

  • JS引擎线程遇到异步函数,会将异步函数交给相应的Webapi,而继续执行后面的任务;

  • Webapi会在条件满足的时候,将异步对应的回调加入消息队列中,等待执行;

  • 当执行栈为空时,JS引擎线程会去取消息队列中的回调函数(若有的话),并加入执行栈中执行;

  • 完成后出栈,执行栈再次为空,重复上面的操作



  1. 宏任务(macrotask)和微任务(microtask)是什么?

  • 宏任务:setTimeout,setInterval,setImmediate,requestAnimationFrame,I/O,UI rendering

  • 微任务:process.nextTick,Promise,Object.observe,MutationObserver

发布于: 2020 年 07 月 19 日阅读数: 89
用户头像

GKNick

关注

还未添加个人签名 2018.12.12 加入

还未添加个人简介

评论

发布
暂无评论
谈谈你是如何理解JS异步编程的,EventLoop、消息队列都是做什么 ,什么是宏任务,什么是微任务?