我在使用地理定位 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);
          }

所以,我有点困惑。
  • 整个回调是否仍在 angular 的范围内?
  • 如果是这样,为什么 $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/

    10-13 04:14