. затем не ожидая возврата функции при использовании 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);
});
})
}
};
});