AngularJS: $digest already in progress

1

Niedawno dostałem info o błędzie w systemie:

Error: $digest already in progress

Nic nadzwyczajnego, zdarza się. Guglanie rozwiązania może skutkować zastosowaniem takiego obejścia:

if(!$scope.$$phase) {
  //$digest or $apply
}

Co nam to da? To, że błąd się nie pojawi. Oraz to, że nasz kod się nie wykona <facepalm>. Taki workaround znalazł się nawet na krótkiej oficjalnej liście anti–patterns Angulara.

Dopiero głębsze zagrzebanie się w lekturze różnych internetowych porad zaskutkowało odnalezieniem poprawnego, jak mi się wydaje, rozwiązania:

function logic() {
    // my code to apply 
}
if (!$scope.$$phase) {
    logic();
} else {
    $timeout(logic);
}

Spowoduje to poczekanie aż skończy się aktualny cykl digest/apply, jeśli taki cykl właśnie trwa, i wstrzelenie się z kodem od razu jak się skończy.

Swoją drogą moim zdaniem rozwiązanie tego problemu powinno się znajdować we frameworku a nie w kodzie aplikacji, no ale… się nie znajduje (przynajmniej w wersji, z której korzystamy, czyli 1.0.7).

Share.

About Author

Programista, trener, prelegent, pasjonat, blogger. Autor podcasta programistycznego: DevTalk.pl. Jeden z liderów Białostockiej Grupy .NET i współorganizator konferencji Programistok. Od 2008 Microsoft MVP w kategorii .NET. Więcej informacji znajdziesz na stronie O autorze. Napisz do mnie ze strony Kontakt. Dodatkowo: Twitter, Facebook, YouTube.

1 Comment

  1. Samo $timeout(logic) też da radę, a jest 4 linie krótsze.

Newsletter: devstyle weekly!
Dołącz do 1000 programistów!
  Zero spamu. Tylko ciekawe treści.
Dzięki za zaufanie!
Do przeczytania w najbliższy piątek!
Niech DEV będzie z Tobą!