. затем не ожидая возврата функции при использовании cordovaGeolocation

Я снова обращаюсь к StackOverFlow в своем стремлении изучить Javascript и Ionic.

Я создал следующую фабричную функцию:

.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 не ожидает разрешения GeoService.getPosition(), прежде чем пытаться отправить информацию через http. Я подозреваю, что мне нужно использовать что-то вроде q.all, но я просто не уверен.

Большое спасибо

2 ответа

Решение

Вы должны определить свое собственное обещание

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

});

Ты используешь .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);
              });
          })
      }
  };

});
Другие вопросы по тегам