[英]Is scope.$apply synchronous in AngularJS?
以下代码是否在AngularJS中同步?
scope.$apply(function(){
console.log('foo');
});
是的。
$ apply()是同步的,当JavaScript在主线程上运行时,浏览器会阻止用户输入。 如果用户快速执行多个输入事件,则规范保证浏览器将这些事件排队。
$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.