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).
Samo $timeout(logic) też da radę, a jest 4 linie krótsze.