2

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");
    }
  });
});
4

2 回答 2

1

简答

是的*

*长答案

的提供者$q定义了调用的nextTick回调$rootScope.evalAsync(callback)

引用手册:

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

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

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

注意:如果在 $digest 循环之外调用此函数,则会安排一个新的 $digest 循环。但是,我们鼓励总是在 $apply 调用中调用更改模型的代码。这包括通过 $evalAsync 评估的代码。

于 2015-12-07T23:41:25.980 回答
0

因为我还不能评论:是的,只要你$q用来创造你的承诺。使用 3rd-party-promise-libraries 您可能能够逃脱摘要循环。

顺便说一句,您可以通过一些技巧来编写更优雅的代码:

$q.when([]).then(function(){
  ...
}); 
于 2015-12-07T23:38:40.523 回答