fbpx
devstyle.pl - Blog dla każdego programisty
devstyle.pl - Blog dla każdego programisty
2 minut

AngularJS: $digest already in progress


06.02.2014

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).

Nie przegap kolejnych postów!

Dołącz do ponad 9000 programistów w devstyle newsletter!

Zapisując się na newsletter zgadzasz się na przetwarzanie Twoich danych osobowych w celu wysyłania na wskazany przez Ciebie adres e-mail informacji handlowych o nowościach, promocjach, produktach i usługach związanych z serwisem devstyle.pl. Będzie to marketing bezpośredni, do realizacji którego wykorzystam Twoje telekomunikacyjne urządzenia końcowe. Administratorem Twoich danych osobowych będzie Maciej Aniserowicz prowadzący działalność gospodarczą w Białymstoku (15-215) przy ul. Konopnickiej 14/8, NIP 5422824401. Przysługuje Tobie prawo do cofnięcia zgody, żądania wglądu do Twoich danych, wniesienia sprzeciwu co do ich przetwarzania, sprostowania, usunięcia i ograniczenia przetwarzania. Więcej informacji o tym jak przetwarzam Twoje dane znajdziesz na devstyle.pl/RODO. Powered by ConvertKit
Notify of
doodack
doodack

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

Kurs Gita

Zaawansowany frontend

Szkolenie z Testów

Szkolenie z baz danych

Facebook

Książka

Zobacz również