JS异步理解

70 阅读2分钟
  • 同步和异步任务分别进入不同的执行场所,同步的进入主线程,异步的进入Event Table并注册函数,以待后面事件循环去调用它。

  • 当指定的事情完成时(重点),Event Table会将这个函数移入Event Queue

  • 主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行

  • 上述的过程会不断的重复,也就是常常说的Event Loop(事件循环)

  • 当将一个函数传给 process.nextTick() 时,则指示引擎在当前操作结束(在下一个事件循环滴答开始之前)时调用此函数。

  • 所以实现异步的方案有:

  • 回调函数调用。

  • 事件监听。

  • 我们假定,存在一个"信号中心",某个任务执行完成,就向信号中心"发布"(publish)一个信号,其他任务可以向信号中心"订阅"(subscribe)这个信号,从而知道什么时候自己可以开始执行。这就叫做"发布/订阅模式"(publish-subscribe pattern),又称"观察者模式"(observer pattern)。

  • Promise/A+。

  • 生成器Generators/ yield。

  • async/await。

  • 主线程的执行过程就是一个 tick,而所有的异步结果都是通过 “任务队列” 来调度被调度。

  • 在浏览器环境中,常见的 macro task 有 setTimeout、MessageChannel、postMessage、setImmediate;常见的 micro task 有 MutationObsever 和 Promise.then。

  • 数据变化到dom变化是异步过程。

  • **这就是我们平时在开发的过程中,比如从服务端接口去获取数据的时候,数据做了修改,如果我们的某些方法去依赖了数据修改后的 DOM 变化,我们就必须在 nextTick 后执行
    **

  • 通过这一节对 nextTick 的分析,并结合 setter 分析,我们了解到数据的变化到 DOM 的重新渲染是一个异步过程,发生在下一个 tick。