我在angularjs
中制作了LocationService
factory('LocationService', function ($q) {
var deferred = $q.defer();
var curPos = {};
var resolved = false;
return {
getPosition : function (refresh) {
if (!resolved || refresh) {
navigator.geolocation.getCurrentPosition(function (pos) {
curPos.curLat = pos.coords.latitude;
curPos.curLng = pos.coords.longitude;
resolved = true;
console.log("Resolve", curPos);
deferred.resolve(curPos);
}, function (error) {
deferred.reject('Unable to get location: ' + error.message);
}, {
enableHighAccuracy : true
});
} else {
deferred.resolve(curPos);
}
return deferred.promise;
}
}
})
并像这样使用
LocationService.getPosition(refresh).then(function (curPos) {
console.log('then');
var latLng = new google.maps.LatLng(curPos.curLat, curPos.curLng);
$scope.map.setCenter(latLng);
$scope.map.setZoom(15);
});
第一次它工作正常,但是当我点击一个调用getPosition()
的按钮时,它甚至会在LocationService
触发器deferred.resolve()
之前解析。我在回调中得到了错误的结果。但最终在2/3秒后getCurrentPosition
触发回调,新值在curPos
中设置。我下次会得到的。
控制台首先打印then
,然后在2/3秒后打印Resolve
。
我无法理解这里的错误。有人可以指导一下吗?
答案 0 :(得分:0)
您的延期获取声明为服务构建的一部分。第一次调用getPosition后,延迟就会得到解决。您需要为每次调用getPosition创建并使用新的延迟。