2016-12-05 3 views
2

Я получаю очень странное исключение с AngularJS 1.5.9

[$ rootScope: inprog] нуль уже в процессе

Вот исходный код, где это исключение:

function beginPhase(phase) { 
    if ($rootScope.$$phase) { 
    throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase); 
    } 

    $rootScope.$$phase = phase; 
} 

beginPhase() называется с «$ применять» или «$ дайджеста» ,

Мой вопрос:

  • Как можно войти в "если", а $ rootScope $$ фаза равна нулю.?

Любая помощь будет оценена по достоинству.

+0

Для документации по ошибке, посетите https://docs.angularjs.org/error/$rootScope/inprog – georgeawg

+0

я получаю подобную проблему сообщили через наше программное обеспечение мониторинга - единственный способ это происходит, если вы передаете строку, содержащую «null» в качестве аргумента функции. Проблема заключается в том, что beginPhase() вызывается только дважды во всем угловом источнике - и в обоих случаях он принимает «$ apply» или «$ digest». Поэтому, хотя это ключ, я все еще не понимаю, почему это происходит. – Veetek

ответ

1

Чтобы ответить на ваш вопрос $ rootScope. $$ фаза может быть установлен в «нулевой» (строка), что приведет к ошибке броска.

Я не уверен, как вы смогли зафиксировать это сообщение, но Sentry сообщает, что для меня и я получаю тонну этих исключений только от кучки пользователей.

Так что для того, чтобы уменьшить the spam я сделал функцию, которая будет удалить стек из исключения, и очистит $ rootScope $$ фаза, которая, мы надеемся, предотвратить появление второго:.

function exceptionHandler(){ 
    const error = Error; 
    const nullMessage = "[$rootScope:inprog] null already in progress"; 

    function exception(message){ 
     if(message.indexOf(nullMessage) === 0){ 
      const $rootScope = exceptionHandler.$rootScope; 
      if($rootScope) $rootScope.$$phase = null; 

      const exception = new error(nullMessage); 
      exception.stack = ""; 
      return exception; 
     } 

     return new error(message); 
    } 

    Error = exception; 
} 

exceptionHandler(); // If it's not run AngularJS will use the original Error constructor, the one we're decorating 

а потом в angular.run впрыснуть $ rootScope и установить его как свойство функции:

angular.run(["$rootScope", function($rootScope){ 
    exceptionHandler.$rootScope = $rootScope; 
}]); 

Мое предположение заключалось в том, что расширение устанавливало $ rootScope. $$ phase до «null», но после установки тех же расширений, что и один из моих пользователей, исключение не произошло.

Star on GistHub

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