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

0 0 votes
Article Rating
1 Comment
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
doodack
doodack
10 years ago

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

Kurs Gita

Zaawansowany frontend

Szkolenie z Testów

Szkolenie z baz danych

Książka

Zobacz również