143 votes

erreur $ apply déjà en cours

Trace de la pile:

 Error: $apply already in progress
at Error (<anonymous>)
at beginPhase (file:///android_asset/www/built.min.js:7:22740)
at Object.Scope.$apply (file:///android_asset/www/built.min.js:7:25967)
at navigator.geolocation.getCurrentPosition.that (file:///android_asset/www/built.min.js:13:8670)
at Object.geolocation.getCurrentPosition (file:///android_asset/www/plugins/org.apache.cordova.core.geolocation/www/geolocation.js:122:13)
at Object.getCurrentPosition (file:///android_asset/www/built.min.js:13:8589)
at Object.getCurrentPosition (file:///android_asset/www/built.min.js:13:8277)
at Object.getCurrentCity (file:///android_asset/www/built.min.js:13:8941)
at Object.$scope.locateDevice (file:///android_asset/www/built.min.js:13:10480)
at file:///android_asset/www/built.min.js:7:12292:7
 

fait référence à ce code http://pastebin.com/B9V6yvFu

     getCurrentPosition: cordovaReady(function (onSuccess, onError, options) {

        navigator.geolocation.getCurrentPosition(function () {
            var that = this,
                args = arguments;

            if (onSuccess) {
                $rootScope.$apply(function () {
                    onSuccess.apply(that, args);
                });
            }
        }, function () {
            var that = this,
                args = arguments;
            if (onError) {
                $rootScope.$apply(function () {
                    onError.apply(that, args);
                });
            }
        }, {
            enableHighAccuracy: true,
            timeout: 20000,
            maximumAge: 18000000
        });
    })
 

Chose étrange, cela fonctionne très bien sur mon LG4X, mais sur mon samsung s2, l'erreur ci-dessus est générée. Des idées ce qui ne va pas?

108voto

Brian Genisio Points 30777

Vous recevez ce message, car vous appelez $apply à l'intérieur d'un cycle de la digestion.

La grande question est: pourquoi êtes-vous en appelant $apply? Vous ne devriez pas avoir besoin d'appeler $apply , sauf si vous êtes l'interface du non-Angulaire de l'événement. L'existence d' $apply signifie généralement je fais quelque chose de mal (sauf, encore une fois, le $s'appliquent arrive à partir d'un non-Angulaire de l'événement).

Si $apply est vraiment approprié ici, pensez à utiliser un "appliquer":

https://coderwall.com/p/ngisma

58voto

CAT Points 335

Utilisez simplement $ evalAsync au lieu de $ apply.

44voto

Dariraze Points 155

Vous pouvez utiliser cette déclaration:

 if ($scope.$root.$$phase != '$apply' && $scope.$root.$$phase != '$digest') {
    $scope.$apply();
}
 

24voto

jeff.d Points 174

Si la portée doit être appliquée dans certains cas, vous pouvez définir un délai d'attente de sorte que le $ apply soit différé jusqu'au prochain tick.

 setTimeout(function(){ scope.$apply(); });
 

ou envelopper votre code dans un $ timeout (function () {..}); car $ appliquera automatiquement la portée à la fin de l’exécution. Si vous avez besoin que votre fonction se comporte de manière synchrone, je ferais la première.

2voto

Tamil Vendhan Points 6017

Juste résolu ce problème. C'est documenté ici .

J'appelais $rootScope.$apply deux fois dans le même flux. Tout ce que j'ai fait est enveloppé le contenu de la fonction de service avec un setTimeout(func, 1) .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X