4

我们有一个超级奇怪的登录错误,似乎是由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。

4

0 回答 0