我目前正在开发一个Angular应用程序,但我很难实现与resolve
的承诺。我想做到的是在以下几点:在Angular应用程序的路线中创建一个承诺
- 获取一个用户的地理位置
- 使用用户的地理位置作为参数的API调用来Songkick的
- 数据已经从API调用接收成功后,我想要
home.html
页面加载在q.resolve
q.resolve
所有这些想要发生的顺序。基本上,在显示我的主页之前我需要获取数据。问题是,当我在我的homeCtrl
控制台日志getLocation
它是未定义的。任何人都知道为什么或有更好的方法来处理这种事情?
供参考:assignValues
是定义了地理位置值后的成功回调。
routes.js
angular.module('APP', ['ui.router',
'APP.home',
'uiGmapgoogle-maps'
])
.config(function($urlRouterProvider, $stateProvider, uiGmapGoogleMapApiProvider) {
$stateProvider.state("home", {
url:"/",
templateUrl: '/home.html',
controller: 'homeCtrl',
resolve: {
getLocation: function(dataFactory, $q){
var q = $q.defer();
navigator.geolocation.getCurrentPosition(assignValues);
function assignValues(position) {
dataFactory.getMetroArea(position.coords.latitude, position.coords.longitude).then(function(data){
q.resolve(data);
return q.promise;
})
}
}
}
})
HomeCtrl.js
angular.module('APP.home',['APP.factory'])
.controller('homeCtrl', ['$rootScope', '$scope', '$http', '$location', 'dataFactory', 'artists','uiGmapGoogleMapApi', 'getLocation', homeCtrl])
function homeCtrl($rootScope, $scope, $http, $location, dataFactory, artists, uiGmapGoogleMapApi, getLocation){
$scope.googleMapsData = getLocation
}
dataFactory.js(工厂的左出其余部分)
dataFactory.getMetroArea = function(lat, lon){
return $http.get('http://api.songkick.com/api/3.0/search/locations.json?location=geo:'+ lat + ',' + lon + '&apikey=APIKEY')
}
其中'dataFactory.getMetroArea'从 –
获得位置'哦,哇,完全忘了'getCurrentPosition'是异步的。相应地编辑我的答案。 –