13

Andere Beiträge zu diesem Fehler enthalten immer jemanden, der versucht, sich zu bewerben, ohne eine sichere Anwendung zu verwenden, aber das ist in meinem Fall nicht der Fall Beispiel. Meine Funktion gibt erfolgreich die Daten zurück, die ich von der API angefordert habe, aber ich kann diesen Fehler nicht beseitigen und er macht mich verrückt. Jedes Mal, bevor der .success in meiner $ http-Funktion aufgerufen wird, bekomme ich "Error: [$ rootScope: inprog] $ digest in progress" in der Konsole. Unten sind mein Controller und mein Service. Vielen Dank!

Hier ist mein Service einschließlich einer Funktion einen $ http Anruf mit einer Nutzlast zu schreiben:

Services.service('CoolService', ['$q', '$rootScope', '$http', 'Auth', function($q, $rootScope, $http, Auth){ 
var service = { 
    create: function(payload){ 
     var deferred = $q.defer(); 
     $http({ 
      'url': '/api/endpoint/', 
      'dataType':'json', 
      'method': 'POST', 
      data: payload 
     }).success(function(data,status, headers, config){ 
      deferred.resolve(data); 

     }) 
     .error(function(data, status, headers, config){ 
      deferred.reject("Error in request."); 
     }); 
     return deferred.promise; 
     } 
    } 
    return service; 
}]); 

Und hier ist mein Controller, die den Dienst aufruft:

controllers.controller('CoolCtrl',['$scope', '$modal', '$log','CoolService', function($scope, $modal, $log, CoolService){ 
    getCoolData = function (input_data) { 
     CoolService.create(input_data).then(function(results){ 
      new_cool = results.results; 
     }, function(error){ 
     console.log("there was an error getting new cool data"); 
     }); 
    }; 
    var payload = { 
     user_id: data1, 
     cool_id: data2, 
    } 
    var new_cool_data = getCoolData(payload); 
    console.log(new_cool_data); 
}]); 

Das Protokoll unter var new_cool_data aufgerufen wird vor der asynchronen Operation, aber new_cool wird innerhalb der .then-Anweisung in getCoolData zugewiesen. Jede Hilfe, die diesen Fehler beseitigt oder es im Allgemeinen nicht beschissen macht, würde sehr geschätzt werden!

Hier ist der ganze Fehler: https://gist.github.com/thedore17/bcac9aec781ef9ba535b

+0

Haben Sie mehr von dem Stack-Trace vor dem Fehler? –

+0

Das ist die ganze Sache: https://gist.github.com/thedore17/bcac9aec781ef9ba535b – TedCap

+1

Ihr Fehler passiert in ui-Bootstrap, nicht Ihr Service: (anonyme Funktion) ui-bootstrap-tpls-0.10.0.js: 1539 –

Antwort

7

diese kleine Add-Methode und nennt es Inplace von anwenden()

function CheckScopeBeforeApply() { 
    if(!$scope.$$phase) { 
     $scope.$apply(); 
    } 
}; 
+6

Dies ist Anti-Pattern https://github.com/angular/angular.js/wiki/Anti-Patterns –

+0

Ja, das ist Anti-Pattern. Siehe meine Antwort unten für eine Alternative. – Sam

0

Das ist für mich das Problem zu lösen. Fügen Sie einfach es einmal, es Sie brauchen sich nicht zu Ihnen mehr Code zu ändern.

https://github.com/angular/angular.js/issues/10083#issuecomment-145967719

.config(function($provide) { 
    // Workaround for https://github.com/angular/angular.js/issues/10083 
    $provide.decorator('$rootScope', ['$delegate', '$exceptionHandler', 
    function($delegate, $exceptionHandler) { 
     var proto = Object.getPrototypeOf($delegate); 
     var originalDigest = proto.$digest, originalApply = proto.$apply; 
     proto.$digest = function() { 
     if ($delegate.$$phase === '$digest' || $delegate.$$phase === '$apply') return; 
     originalDigest.call(this); 
     }; 
     proto.$apply = function(fn) { 
     if ($delegate.$$phase === '$digest' || $delegate.$$phase === '$apply') { 
      try { 
      this.$eval(fn); 
      } catch(e) { 
      $exceptionHandler(e); 
      } 
     } else { 
      originalApply.call(this, fn); 
     } 
     }; 
     return $delegate; 
    } 
    ]); 
}) 
0

I alternative Lösung, die von $ Rahmen setzen $ apply() in Timeout wie folgt und es arbeitet ...

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

ich denke, es ist nur, weil, Lifecycle-Winkel der Anwendung wurde bereits ausgeführt und mein Handbuch $ gelten hat es unterbrochen.

+0

Sie können das gleiche auch für $ digest() verwenden. –

0

Es gibt eine einfachere Lösung:

$scope.$evalAsync(function() { 
    // Code here 
}); 

Oder einfach:.

$scope.$evalAsync(); 

Dies vermeidet die von $ scope verursachten Probleme $ apply(), obwohl es sollte beachtet werden, dass es nicht run sofort (das ist ein Teil des Grundes, dass Sie den Fehler inprog nicht bekommen). Ich benutze dies anstelle von $ scope. $ Apply() und es hat mich vor so viel Ärger gerettet.

See: https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope # $ evalAsync

Verwandte Themen