在$ stateProvider中解析promise然后使用结果

时间:2015-08-23 17:24:39

标签: javascript angularjs promise

我想在stateprovider中解决一个promise,因为我必须在另一个promise中使用promise的结果。

我不太确定该怎么做。我做了类似的事情

 app
    .config(['$stateProvider','GeolocationService',
      function($stateProvider,geolocation){
        $stateProvider.state('sendCoords',{
          resolve: {
            long: function (geolocation) {
              geolocation().then(function (position) {
                return position.coords.longitude;
              }, function (reason) {
                return false;
              })
            },
            lat: function (geolocation) {
              geolocation().then(function (position) {
                return position.coords.longitude;
              }, function (reason) {
                return false;
              })
            }
          },
          controller: 'appCtrl'
        })

      }
    ]);

这是否正确?我想解决地理定位,然后使用' lat'而且' long'控制器中的变量。

app.controller('appCtrl',['$scope','serviceTest',function($scope,serviceTest,lat,long){
       $scope.optionsToChoose = [];
        serviceTest.options(long,lat).then(
          function (option) {
            $scope.optionsToChoose = option;
          },
          function(error){
          }
        );
}]

但是,像这样注入lat和long,它们没有被定义。我相信我在这里犯了一些错误,但我并没有真正理解。希望你能帮帮我。

编辑:这是地理位置服务代码

app.factory("GeolocationService", ['$q', '$window', '$rootScope',
  function ($q, $window, $rootScope) {
    return function () {
      var deferred = $q.defer();

      if (!$window.navigator) {
        $rootScope.$apply(function() {
          deferred.reject(new Error("Geolocation is not supported"));
        });
      } else {
        $window.navigator.geolocation.getCurrentPosition(function (position) {
          $rootScope.$apply(function() {
            deferred.resolve(position);
          });
        }, function (error) {
          $rootScope.$apply(function() {
            deferred.reject(error);
          });
        });
      }

      return deferred.promise;
    }
  }]);

1 个答案:

答案 0 :(得分:1)

ui.router支持注入"已解决"将值转换为其他待解析函数。我会使用@charlietfl将longlat解析为单个对象的好建议:

resolve: {
  position: function(GeolocationService){
    return GeolocationService().then(function(position){
      return { long: position.coords.longitude,
               lat:  position.coords.latitude };
    });
  },
  options: function(serviceTest, position){
    return serviceTest.options(position.long, position.lat)
                      .then(function(option){ return option; });
  }
}