Является ли следующий код синхронным в AngularJS?
scope.$apply(function(){
console.log('foo');
});
Является ли следующий код синхронным в AngularJS?
scope.$apply(function(){
console.log('foo');
});
Да, это так.
$ apply() является синхронным, а браузер блокирует ввод пользователя, а JavaScript работает в основном потоке. Если пользователь быстро выполнит событий с несколькими входами, спецификация гарантирует, что браузер будет очереди этих событий.
Подробнее здесь: https://github.com/angular/angular.js/issues/3782
Да, $apply()
Синхронный.
Если вы хотите Asynchronous аналог, вы можете использовать
$applyAsync()
График призывание $ применяются произойти в более позднее время. Фактическая разница во времени варьируется в разных браузерах, но обычно около ~ 10 миллисекунд.
Это может использоваться для очереди нескольких выражений, которые необходимо оценить в одном и том же дайджесте.
Также, читайте this нить.
$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');
});
);
, который будет выполняться после того, как $ переваривать цикл
из [документы] (HTTPS : //docs.angularjs.org/api/ng/type/$rootScope.Scope#$apply) да, есть [asyncApply] (https://docs.angularjs.org/api/ng/type/$rootScope. Scope # $ applyAsync) для async – Hacketo