如何在Angular中获取一个变量之外的变量?

时间:2016-12-28 05:26:58

标签: javascript angularjs angular-promise

所以我在这里有一个代码:

.factory("Geolocation", ["$cordovaGeolocation",
  function ($cordovaGeolocation) {
    var posOptions = {
      timeout: 10000,
      enableHighAccuracy: false
    };
    var getCurrentPosition = $cordovaGeolocation.getCurrentPosition(posOptions);
    return {
      lat: function () {
       getCurrentPosition.then(function(position) {
          return position.coords.latitude; //getting undefined  
        })
      },
      long: function() {
       getCurrentPosition.then(function(position) {
          return position.coords.longitude;  
        })
      }
    }

  }
])

在我的控制器中,我称之为Geolocation.lat()Geolocation.long()

现在我的问题是我得到的是undefined而不是lat和long。

如果我这样做:

return getCurrentPosition.then(function(position) {
  return position.coords.longitude;  
})

我得到了另一个多余的承诺,而我唯一想要发生的是获得lat和long。

是否有一种简单的方法可以访问该承诺中的变量?

非常感谢任何帮助。

UPDATE (尝试在外部声明一个变量并在promise中填充,但我仍然得到一个空值。

.factory("Geolocation", ["$cordovaGeolocation", "$rootScope",
  function ($cordovaGeolocation, $rootScope) {
    var posOptions = {
      timeout: 10000,
      enableHighAccuracy: false
    };
    var getCurrentPosition = $cordovaGeolocation.getCurrentPosition(posOptions);
    $rootScope.latitude = null;
    $rootScope.longitude = null;
    return {
      lat: function () {
       getCurrentPosition.then(function(position) {
          $rootScope.latitude = position.coords.latitude;  
        })
        return $rootScope.latitude;
      },
      long: function() {
       getCurrentPosition.then(function(position) {
          return $rootScope.longitude; 
        })
      }
    }

  }
])

3 个答案:

答案 0 :(得分:3)

由于您正在进行异步操作,因此您采用的方法永远不会起作用。

相反,你应该做的是:

  1. 在promise之外声明范围变量。
  2. 解决工厂退回的承诺
  3. 将声明的值分配给response.data
  4. 所以不要从工厂返回then

    而只是将承诺发送给控制器。

    然后在controller执行上述步骤并获取数据。

    var promise = yourFactory.get() //get the promise
    promise.then(function(response){
          $scope.lat = response.data
    })
    

答案 1 :(得分:2)

我猜你在方法异步时以同步方式访问这些变量。

在调用异步方法之后,您无法直接访问变量,因为您的方法尚未完成执行。您需要访问思想承诺或回调函数。

你在回复承诺时走的是正确的方式。

long: function() {
   return getCurrentPosition.then(function(position) {
      return position.coords.longitude;  
    })
  }

但您的控制器需要以异步的承诺方式访问结果。

Geolocation.long().then(function(longitude){
    alert("Here, I can access it " + longitude)
});

答案 2 :(得分:0)

@Hereblur是对的。您应该返回一个承诺并使用then()

这是一个完全有效的例子:

angular
.module("app", ["ngCordova.plugins.geolocation"])
.factory("Geolocation", ["$cordovaGeolocation", function ($cordovaGeolocation) {
            var posOptions = {
                timeout : 10000,
                enableHighAccuracy : false
            };
            var getCurrentPosition = $cordovaGeolocation.getCurrentPosition(posOptions);
            return {
                lat : function () {
                    return getCurrentPosition.then(function (position) {
                        return position.coords.latitude;
                    })
                },
                long : function () {
                    return getCurrentPosition.then(function (position) {
                        return position.coords.longitude;
                    })
                }
            }

        }
    ])
.controller("testCtrl", ["Geolocation", function (Geolocation) {
            Geolocation.lat().then(function (lat) {
                console.log(lat);
            });
            Geolocation.long().then(function (long) {
                console.log(long);
            });
        }
    ]);

jsfiddle with the example