.then在使用cordovaGeolocation时没等待返回功能

时间:2016-12-02 08:54:48

标签: javascript ionic-framework ngcordova

在我追求学习Javascript和Ionic的过程中,我再次转向StackOverFlow。

我创建了以下工厂函数:

.factory('GeoService', function($ionicPlatform, $cordovaGeolocation) {

  var positionOptions = {timeout: 10000, enableHighAccuracy: true};

  return {
    getPosition: function() {
      return $ionicPlatform.ready()
        .then(function() {
          return $cordovaGeolocation.getCurrentPosition(positionOptions);
        })
    }
  };

});

获得GPS坐标。要调用此函数,我将执行以下操作:

        GeoService.getPosition()
            .then(function(position) {
                //Obtain geolocation information
                console.dir(position.coords)

                return position.coords;
            }, function(err) {
                console.log('getCurrentPosition error: ' + err);
            }).then(function(data) {
                console.dir(data)

                //make http request with the information
            })

我遇到的问题是第二个.then在尝试通过http发送信息之前没有等待GeoService.getPosition()解析。我怀疑我需要使用q.all的内容,但我不确定。

非常感谢

2 个答案:

答案 0 :(得分:1)

你在.then()中使用GeoService.getPosition(),但你没有回复承诺!!试试这个:

.factory('GeoService', function($ionicPlatform, $cordovaGeolocation) {

  var positionOptions = {timeout: 10000, enableHighAccuracy: true};

  return {
    getPosition: function() {
      return new Promise(function(resolve) {
        $ionicPlatform.ready()
          .then(function() {
            $cordovaGeolocation.getCurrentPosition(positionOptions)
              .then(function(position) {
                resolve(position);
              });
          })
      }
  };

});

答案 1 :(得分:1)

您应该定义自己的承诺

.factory('GeoService', function($q,$ionicPlatform, $cordovaGeolocation) {


  function getPosition(){

    return $q(function(resolve, reject) {
        var positionOptions = {timeout: 10000, enableHighAccuracy: true};
        $cordovaGeolocation.getCurrentPosition(positionOptions)
        .then(function(position){
             resolve(position); 
        }, function(error){
           reject(error); 
        }); 
    })

  } 
  return {
    getPosition: getPosition
  };

});