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