11

我刚刚开始研究 Angular2 变更检测机制。

我已经阅读了有关该主题的 Thoughram 的博客文章(关于 ZoneJS 和 Angular2 区域的文章),但仍然有 1 个术语我找不到任何定义。

这是这篇文章的摘录:

NgZone 基本上是一个分叉的区域,它扩展了它的 API 并在它的执行上下文中添加了一些额外的功能。它添加到 API 中的一件事是我们可以订阅以下一组自定义事件,因为它们是可观察的流:

onTurnStart() - 在 Angular 的事件轮转开始之前通知订阅者。每个由 Angular 处理的浏览器任务发出一次事件。

onTurnDone() - 在 Angular 的区域完成处理当前轮次以及从该轮次安排的任何微任务后立即通知订阅者。

onEventDone() - 在结束 VM 事件之前的最终 onTurnDone() 回调之后立即通知订阅者。用于测试以验证应用程序状态

我了解区域的概念并且可以分叉,我唯一的问题是VM turnand VM event,我找不到任何定义。

这些 VM 事件和转折是什么?它们是 ZoneJS、Angular 还是浏览器的一部分?

谢谢,阿维。

4

2 回答 2

19

如果有人对答案感兴趣,这为我清除了一切:https ://jakearchibald.com/2015/tasks-microtasks-queues-and-schedules/

当然,还请阅读 Dylan Meeus 给我的链接:什么是区域转弯?

这就是我现在理解这些术语的含义:

VM turn = 浏览器任务 - 由某些浏览器事件循环(例如 setTimout 队列)处理的回调,这些事件循环在堆栈清空时运行。

VM 事件 - 浏览器处理所有待处理任务的操作。

微任务 - 如上面链接的帖子中所述,这些回调根据 HTML 规范,出于性能原因(例如承诺和观察者)不应该被安排为任务,因此它们被安排为称为微任务的东西. 一个微任务进入它自己的特殊队列,该队列在每个回调或任务结束时运行,这意味着如果一个任务调度了一个微任务,该微任务将在该任务结束时运行,从而阻止当时在队列中等待的任何任务。

于 2016-08-06T09:38:06.403 回答
3

从 2.0.0-beta.10 版本开始,onTurnStart、onTurnDone 和 onEventDone 三个方法重命名如下(CHANGELOG.md):

NgZone.onTurnStart => NgZone.onUnstable
NgZone.onTurnDone => NgZone.onMicrotaskEmpty
NgZone.onEventDone => NgZone.onStable

新名字好多了。

于 2017-10-04T19:31:54.930 回答