2015-08-24 2 views
2

Является ли следующий код синхронным в AngularJS?

scope.$apply(function(){ 
    console.log('foo'); 
}); 
+0

из [документы] (HTTPS : //docs.angularjs.org/api/ng/type/$rootScope.Scope#$apply) да, есть [asyncApply] (https://docs.angularjs.org/api/ng/type/$rootScope. Scope # $ applyAsync) для async – Hacketo

ответ

3

Да, это так.

$ apply() является синхронным, а браузер блокирует ввод пользователя, а JavaScript работает в основном потоке. Если пользователь быстро выполнит событий с несколькими входами, спецификация гарантирует, что браузер будет очереди этих событий.

Подробнее здесь: https://github.com/angular/angular.js/issues/3782

1

Да, $apply() Синхронный.

Если вы хотите Asynchronous аналог, вы можете использовать

$applyAsync()

График призывание $ применяются произойти в более позднее время. Фактическая разница во времени варьируется в разных браузерах, но обычно около ~ 10 миллисекунд.

Это может использоваться для очереди нескольких выражений, которые необходимо оценить в одном и том же дайджесте.

Также, читайте this нить.

1

$apply называет $eval.

И $eval является синхронным.

Итак, да, $apply есть.

Для асинхронного метода $evalAsync.

0

Поскольку, похоже, существует функция $scope.$applyAsync(), я бы сказал, что да, это синхронная функция.

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'); 
    }); 
); 

, который будет выполняться после того, как $ переваривать цикл

Смежные вопросы