在Angular app

时间:2015-10-19 03:10:39

标签: javascript angularjs promise

我目前正在开发一个Angular应用,但我很难用resolve实现一个承诺。我想要完成的是以下内容:

  1. 获取用户地理位置
  2. 使用用户地理位置作为对SongKick的API调用的参数
  3. 从API调用成功收到数据后,我希望home.html页面加载q.resolve
  4. 中的数据

    所有人都希望所有这一切按顺序发生。基本上,我需要在显示主页之前获取数据。问题是,当我在getLocation中控制日志homeCtrl时,它是未定义的。任何人都知道为什么或有更好的方法来处理这种事情?

    仅供参考: 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')
      }
    

2 个答案:

答案 0 :(得分:1)

解决方法需要返回一个promise或实际数据。这是一种清理后的解决方法,其中包括拒绝(您不希望暂停请求)。

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

答案 1 :(得分:0)

我认为你的getLocation函数应该是

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