我在使用地理定位 AngularJS 插件 https://github.com/arunisrael/angularjs-geolocation/blob/master/src/geolocation.js 时遇到了一些问题。
当您查看第 17 行时,会调用 $apply
。这对我来说似乎没问题,因为 getCurrentPosition
的回调是异步运行的,并且超出了 angular 摘要的范围:
angular.module('geolocation')
.factory('geolocation', ['$q','$rootScope','$window','geolocation_msgs','$timeout',function ($q,$rootScope,$window,geolocation_msgs,$timeout) {
return {
getLocation: function (opts) {
var deferred = $q.defer();
if ($window.navigator && $window.navigator.geolocation) {
$window.navigator.geolocation.getCurrentPosition(function(position){
$rootScope.$apply(function(){deferred.resolve(position);});
}
在普通的桌面浏览器中,这可以正常工作。但是当在 PhoneGap 应用程序中使用时,连同cordovas 地理定位插件( https://github.com/apache/cordova-plugin-geolocation ),它会在iOS7 上抛出
$digest already in progress
错误。因此,我进行了一些调试,发现以下版本适用于任何地方,在桌面浏览器和 PhoneGap 应用程序中:
angular.module('geolocation')
.factory('geolocation', ['$q','$rootScope','$window','geolocation_msgs','$timeout',function ($q,$rootScope,$window,geolocation_msgs,$timeout) {
return {
getLocation: function (opts) {
var deferred = $q.defer();
if ($window.navigator && $window.navigator.geolocation) {
$window.navigator.geolocation.getCurrentPosition(function(position){
deferred.resolve(position);
}
所以,我有点困惑。
$apply
调用不会在我的桌面浏览器上抛出 $digest already in progress
错误? deferred.resolve(position);
有效?这与对 deferred
变量的引用有关吗? resolve
调用包装在 $apply
回调中的 Promise(并且在 angulars 摘要范围之外)? 希望有人能帮我理清思路!
最佳答案
这一行:
$rootScope.$apply(function(){deferred.resolve(position);});
是不正确的。它应该只是:
deferred.resolve(position);
由于
deferred
来自 $q
,它在 Angulars 世界中。 $q
知道 $rootScope
并且会在您解决 promise 时为您调用 $rootScope.$apply()
。你得到的错误: $digest already in progress
就是证明。 Angular 告诉你,代码的某些部分调用了 $apply()
两次,也就是第 17 行。关于javascript - AngularJS:地理定位 + promise + $apply,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22453881/