繁体   English   中英

是范围。$在AngularJS中应用同步?

[英]Is scope.$apply synchronous in AngularJS?

以下代码是否在AngularJS中同步?

scope.$apply(function(){
  console.log('foo');
});

是的。

$ apply()是同步的,当JavaScript在主线程上运行时,浏览器会阻止用户输入。 如果用户快速执行多个输入事件,则规范保证浏览器将这些事件排队。

更多信息: https//github.com/angular/angular.js/issues/3782

是的, $apply()是同步的。

如果你想要异步对应,你可以使用

$applyAsync()

安排$ apply的调用在以后发生。 实际时间差异因浏览器而异,但通常约为10毫秒。

这可用于排队需要在同一摘要中评估的多个表达式。

另外,请阅读主题。

$apply调用$eval

并且$eval是同步的。

所以,是的, $apply是。

对于异步,有$evalAsync方法。

由于它似乎存在$scope.$applyAsync()函数,我会说是的,这是一个同步函数。

是的 :

角度源代码如下:

  $apply: function(expr) {
    try {
      beginPhase('$apply');
      try {
        return this.$eval(expr);
      } finally {
        clearPhase();
      }
    } catch (e) {
      $exceptionHandler(e);
    } finally {
      try {
        $rootScope.$digest();
      } catch (e) {
        $exceptionHandler(e);
        throw e;
      }
    }

和函数beginPhase

function beginPhase(phase) {
  if ($rootScope.$$phase) {
    throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase);
  }

  $rootScope.$$phase = phase;
}

请注意,如果当前正在进行$apply$digest ,它可以抛出异常。

applyAsync只是将表达式推送到一个数组中,该数组将在下一个$ digest循环中执行。

如果您的目的只是为了确保没有$digest正在进行中,您应该执行以下操作:

$timeout(
    scope.$apply(function(){
        console.log('foo');
    });
);

这将在$ digest周期后执行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM