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");
}
});
});
答案 0 :(得分:1)
是*
$q
的提供商定义了nextTick
callback来呼叫$rootScope.evalAsync(callback)
。
从手册中引用:
$ evalAsync不保证何时执行表达式,只保证:
- 它将在安排评估的函数之后执行(最好在DOM渲染之前)。
- 表达式执行后将执行至少一个$摘要周期。
执行表达式的任何异常都会转发到$ exceptionHandler服务。
注意:如果在$ digest循环之外调用此函数,将安排新的$ digest循环。但是,建议始终在$ apply调用中调用更改模型的代码。这包括通过$ evalAsync评估的代码。
答案 1 :(得分:0)
因为我无法发表评论:是的,只要您使用$q
来创建您的承诺。使用第三方承诺库,您可以逃脱摘要循环。
顺便说一句,你可以用一点点黑客来编写你的代码更优雅:
$q.when([]).then(function(){
...
});