我们有一个超级奇怪的登录错误,似乎是由Angular 的 UpgradeModule 中的这一行引起的,所以我对该行有疑问。
为什么是:
var subscription = _this.ngZone.onMicrotaskEmpty.subscribe(function () { return $rootScope.$digest(); });
不是这样的:
var subscription = _this.ngZone.onMicrotaskEmpty.subscribe(function () {
if($rootScope.$$phase === null){
return $rootScope.$digest();
}
});
?
为什么没有检查该摘要的阶段?
因为在第 214 行甚至有一条评论说
“在下一个 VM 轮次中运行回调 - $interval 调用 $rootScope.$apply,如果在同一个 vm 轮次中,在 NgZone 中运行回调将导致 '$digest already in progress' 错误”
该代码假设,因为它一直等到下一个滴答声,所以没有 $digest 阶段仍在发生。
我们没有使用 $interval,但显然在没有 setTimeout 的情况下调用这些行会导致我们看到的确切错误,所以不应该发生某种相位检查吗?
(而不是假设超时解决了问题)......这似乎是一个竞争条件。
这被标记为 angular 和 angularjs 的原因是因为这是 angular 的升级模块。升级模块在 angular 中使用 angularjs。