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

时间:2015-08-24 09:49:12

标签: javascript angularjs

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

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

4 个答案:

答案 0 :(得分:1)

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

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

<强> $applyAsync()

  

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

     

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

另外,请阅读this主题。

答案 1 :(得分:1)

$apply来电$eval

$eval是同步的。

所以,是的,$apply是。

对于非同步,有$evalAsync方法。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

是的:

角度源代码如下:

  $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周期后执行