13

此錯誤的其他帖子總是包含有人試圖在沒有使用安全申請的情況下申請,但這不是我的情況例。我的函數成功返回了我從API請求的數據,但是我無法清除這個錯誤,這讓我感到非常緊張。 每次在我的$ http函數中調用.success之前,我都會在控制檯中得到「錯誤:[$ rootScope:inprog] $ digest已在進行中」。以下是我的控制器和服務。謝謝!

這裏是我的服務,包括一個功能發佈與有效載荷的$ HTTP調用:

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; 
}]); 

這是我的控制器,它調用服務:

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); 
}]); 

下面VAR new_cool_data日誌被稱爲在異步操作之前,但new_cool在getCoolData中的.then語句內得到分配。 任何幫助擺脫這個bug或使它不蹩腳的一般將不勝感激!

這裏是整個錯誤: https://gist.github.com/thedore17/bcac9aec781ef9ba535b

+0

你有什麼更多的堆棧跟蹤的錯誤之前? –

+0

這是整個事情:https://gist.github.com/thedore17/bcac9aec781ef9ba535b – TedCap

+1

你的錯誤發生在ui-bootstrap中,而不是你的服務:(匿名函數)ui-bootstrap-tpls-0.10.0.js: 1539 –

回答

7

添加這個小方法,並稱之爲地質儲量適用()

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

這是反模式https://github.com/angular/angular.js/wiki/Anti-Patterns –

+0

是的,這是反模式。看到我的答案下面的替代。 – Sam

0

這解決了問題對我來說。只需添加它一次,它不需要改變你的代碼更多:

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

我通過把$範圍使用替代的解決方案適用於$()的超時這樣,它工作...

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

我覺得這只是因爲角度的應用生命週期已經運行和我的手工$所適用中斷了它。

+0

你也可以使用$ digest()。 –

0

這裏有一個簡單的解決方案:

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

或者乾脆:

$scope.$evalAsync(); 

這避免了$範圍的問題$適用(),但應注意的是,它不會立即運行(這是您不會收到inprog錯誤的原因之一)。我使用這個而不是$ scope。$ apply(),它使我免於這麼多麻煩。

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

相關問題