关于Javascript异步编程

295 阅读2分钟

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

JS异步编程

  • 早期javascript是一门主要作用于浏览器端的脚本语言,其主要工作是操作DOM, 从而实现页面的动态交互,为了避免其存在复杂的线程同步问题,所以从一开始,Javascript 就被设定为采用单线程模式工作。
  • 所以在JS执行环境中负责执行代码的线程只有一个,这意味着当出现耗时比较长的任务时,程序可能会被拖延或者卡死,为了解决这种问题,Javascript 将任务的执行模式分为 同步模式异步模式两种
  • Javascript 异步编程就是通过浏览器提供的另外的异步线程完成 使用事件循环去监听调用栈消息队列的变化,从而使程序中的异步任务不会阻塞主线程中的同步任务的执行,而是“排队”执行其对应的一个或者多个回调函数

EventLoop

  • 负责监听调用栈消息队列,一旦当前 调用栈 清空,则将消息队列中的任务压入调用栈执行

消息队列

  • 从相关 Web Apis 中响应得到已经可以执行的异步回调,在消息队列中进行排队,等待 EventLoop 的“刷新”,从而压入 调用栈 执行

宏任务

  • 消息队列中的任务,有 EventLoop 负责监听并触发调用,如 setTimeout
  • 目前绝大多数异步调用都是作为宏任务执行

微任务

  • 为了提高整体的响应能力,js引入了微任务的概念
  • 微任务可以理解为宏任务内部最后产生被执行的任务,如PromiseMutationObserverNode中的process.nextTick
  • 微任务是不需要等待下一次事件循环进入调用栈执行,而是继续在当前的 tick 中执行