以下代码是否在AngularJS中同步?
scope.$apply(function(){
console.log('foo');
});
答案 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周期后执行