在 Angular 中异步加载工厂中的坐标
Loading Coordinates in a Factory Asynchronously in Angular
我在地图控制器中调用工厂 returns 太快了。我正在尝试设置地图的中心,但是由于调用 geo returns undefined 它永远不会设置中心。然而,坐标是在地理工厂中获取的。他们来不及了。
我认为 .then() 的意义在于等待返回日期。那么,如何强制我的应用等待?
我的工厂是:
angular.module('comhubApp')
.factory('geo', function ($q) {
var getPosition = function () {
var deferred = $q.defer();
if (navigator.geolocation) {
deferred.resolve(navigator.geolocation.getCurrentPosition(function (position) {
var crd = position.coords;
console.log('Latitude : ' + crd.latitude);
console.log('Longitude: ' + crd.longitude);
return crd;
} ));
}
return deferred.promise;
}
// Public API here
return {
getPosition: getPosition
};});
我的地图控制器调用它:
// GEOLOCATION
geo.getPosition().then( function (position) {
console.log(position);
$scope.center.lat = position.latitude;
$scope.center.lon = position.longitude;
});
您在 geolocation.getCurrentPosition 返回之前呼叫 deferred.resolve。您需要在以下时间之后调用它:
var getPosition = function() {
var deferred = $q.defer();
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
var crd = position.coords;
console.log('Latitude : ' + crd.latitude);
console.log('Longitude: ' + crd.longitude);
deferred.resolve(crd);
});
}
return deferred.promise;
}
这是一个有效的插件:http://plnkr.co/edit/H7LEjsrSkZOzGBZIeTXF?p=preview
我在地图控制器中调用工厂 returns 太快了。我正在尝试设置地图的中心,但是由于调用 geo returns undefined 它永远不会设置中心。然而,坐标是在地理工厂中获取的。他们来不及了。
我认为 .then() 的意义在于等待返回日期。那么,如何强制我的应用等待?
我的工厂是:
angular.module('comhubApp')
.factory('geo', function ($q) {
var getPosition = function () {
var deferred = $q.defer();
if (navigator.geolocation) {
deferred.resolve(navigator.geolocation.getCurrentPosition(function (position) {
var crd = position.coords;
console.log('Latitude : ' + crd.latitude);
console.log('Longitude: ' + crd.longitude);
return crd;
} ));
}
return deferred.promise;
}
// Public API here
return {
getPosition: getPosition
};});
我的地图控制器调用它:
// GEOLOCATION
geo.getPosition().then( function (position) {
console.log(position);
$scope.center.lat = position.latitude;
$scope.center.lon = position.longitude;
});
您在 geolocation.getCurrentPosition 返回之前呼叫 deferred.resolve。您需要在以下时间之后调用它:
var getPosition = function() {
var deferred = $q.defer();
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
var crd = position.coords;
console.log('Latitude : ' + crd.latitude);
console.log('Longitude: ' + crd.longitude);
deferred.resolve(crd);
});
}
return deferred.promise;
}
这是一个有效的插件:http://plnkr.co/edit/H7LEjsrSkZOzGBZIeTXF?p=preview