.然后在使用 cordovaGeolocation 时不等待 return 函数

.then not waiting for return function when using cordovaGeolocation

为了学习 Javascript 和 Ionic,我再次求助于 Whosebug。

我创建了以下工厂函数:

.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 的东西,但我不确定。

非常感谢

您正在 GeoService.getPosition() 中使用 .then() 但您没有返回 Promise!!试试这个:

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

});

您应该定义自己的承诺

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

});