简体   繁体   中英

Creating a promise within resolve in routes for Angular app

I am currently working on an Angular app, but I am having difficulty implementing a promise with resolve . What I want to accomplish is in the following:

  1. Get a users geolocation
  2. Use the users geolocation as parameters for an API call to SongKick
  3. After the data has been received from the API call successfully I want the home.html page to load with the data found in q.resolve

All want all of this to happen in order. Essentially, there is data I need to obtain before displaying my home page. The problem is that when I console log getLocation in my homeCtrl it is undefined. Anyone know why or have a better way to approach this kind of thing?

FYI: assignValues is a success callback after geolocation values have been defined.

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 (left out rest of factory)

  dataFactory.getMetroArea = function(lat, lon){
    return $http.get('http://api.songkick.com/api/3.0/search/locations.json?location=geo:'+ lat + ',' + lon + '&apikey=APIKEY')
  }

Resolve methods need to either return a promise, or actual data. Here's a cleaned up resolve method which include rejections (you don't want to leave your request hanging).

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(function(position){
            dataFactory.getMetroArea(position.coords.latitude, position.coords.longitude).then(function(data){
              q.resolve(data);
            },function(err){
              q.reject(err);
            })
          },function(err){
            q.reject(err);
          });
          return q.promise;
        }
      }
    });
  });

I think your getLocation function should be

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;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM