Angular承诺回调和摘要周期

时间:2015-12-07 23:30:31

标签: angularjs angular-promise angular-digest

AngularJS中的promise回调是否保证在摘要周期中被调用?

setTimeout(function () {
  var deferred = $q.defer();
  deferred.resolve();
  deferred.promise.then(function () {
    if ($rootScope.$$phase) {
      //I seem to be hitting this block
      console.log("in digest");
    } else {
      //Could I ever hit this block?
      console.log("not in digest");
    }
  });
});

2 个答案:

答案 0 :(得分:1)

简答

是*

*长答案

$q的提供商定义了nextTick callback来呼叫$rootScope.evalAsync(callback)

从手册中引用:

  

$ evalAsync不保证何时执行表达式,只保证:

     
      
  • 它将在安排评估的函数之后执行(最好在DOM渲染之前)。
  •   
  • 表达式执行后将执行至少一个$摘要周期。
  •   
     

执行表达式的任何异常都会转发到$ exceptionHandler服务。

     

注意:如果在$ digest循环之外调用此函数,将安排新的$ digest循环。但是,建议始终在$ apply调用中调用更改模型的代码。这包括通过$ evalAsync评估的代码。

答案 1 :(得分:0)

因为我无法发表评论:是的,只要您使用$q来创建您的承诺。使用第三方承诺库,您可以逃脱摘要循环。

顺便说一句,你可以用一点点黑客来编写你的代码更优雅:

$q.when([]).then(function(){
  ...
});