谈谈如何理解 JS 异步编程的,EventLoop、消息队列都是做什么的,什么是宏任务,什么是微任务?
JS异步编程
- 早期
javascript
是一门主要作用于浏览器端的脚本语言,其主要工作是操作DOM
, 从而实现页面的动态交互,为了避免其存在复杂的线程同步问题,所以从一开始,Javascript
就被设定为采用单线程模式工作。 - 所以在JS执行环境中负责执行代码的线程只有一个,这意味着当出现耗时比较长的任务时,程序可能会被拖延或者卡死,为了解决这种问题,Javascript 将任务的执行模式分为
同步模式
和异步模式
两种 - 而
Javascript
异步编程就是通过浏览器提供的另外的异步线程完成 使用事件循环
去监听调用栈
和消息队列
的变化,从而使程序中的异步任务不会阻塞主线程中的同步任务的执行,而是“排队”执行其对应的一个或者多个回调函数
EventLoop
- 负责监听
调用栈
和消息队列
,一旦当前调用栈
清空,则将消息队列中的任务压入调用栈
执行
消息队列
- 从相关
Web Apis
中响应得到已经可以执行的异步回调
,在消息队列中进行排队,等待EventLoop
的“刷新”,从而压入调用栈
执行
宏任务
- 消息队列中的任务,有
EventLoop
负责监听并触发调用,如setTimeout
- 目前绝大多数异步调用都是作为宏任务执行
微任务
- 为了提高整体的响应能力,js引入了微任务的概念
- 微任务可以理解为宏任务内部最后产生被执行的任务,如
Promise
和MutationObserver
及Node
中的process.nextTick
- 微任务是不需要等待下一次事件循环进入
调用栈
执行,而是继续在当前的tick
中执行