所以我在这里有一个代码:
.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;
})
}
}
}
])
答案 0 :(得分:3)
由于您正在进行异步操作,因此您采用的方法永远不会起作用。
相反,你应该做的是:
response.data
。所以不要从工厂返回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);
});
}
]);