-
同步和异步任务分别进入不同的执行场所,同步的进入主线程,异步的进入
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。