var cordinats = function () {
return new Promise(function(resolve, reject){
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
var long = position.coords.longitude,
lat = position.coords.latitude;
var myLocation = {
long: long,
lat: lat
};
console.log('Оп1');
resolve(myLocation);
console.log(myLocation);
})
}
var errObj = {
0: "Unkonown Error",
1: "Permission denied by User",
2: "Position is not available",
3: "Request Timed Out"
}
console.log('Оп2');
reject(`${err.code} ${errObj[err.code] }`);
});
}
cordinats().then(function(location) {
var loc = location;
console.log(loc);
changeHtmlInfo();
}, function(error) {
});
Я открываю код через Chrome. Сначала в консоли появляется Оп2. Потом при подтверждении данных о считывании геолокации - Оп1. Последный console.log(loc) вообще не выполняется. Вопрос:
cordinats().then Метод getCurrentPosition - асинхронный. Это значит, что при заходе в if выполнение не останавливается, пока не выполнится callback, а проходит дальше, выходит из if и вызывает reject.
Метод then принимает два параметра: первый для успешного разрешения и второй - для не успешного.
Так как всегда вызывается reject, то всегда вызывалась функция переданная вторым параметром, и, так как она пустая, ничего не выводилось.
Например, можно избавиться от if и воспользоваться тем, что метод getCurrentPosition тоже может принимать обработчик для ошибки. Теперь функция вызывается всегда и завершение Promise зависит от вызова соответствующего обработчика, достаточно просто вызвать в нужных местах resolve и reject.
function cordinats() {
return new Promise(function(resolve, reject){
navigator.geolocation.getCurrentPosition(function(position) {
var long = position.coords.longitude,
lat = position.coords.latitude;
var myLocation = {
long: long,
lat: lat
};
resolve(myLocation);
}, function(err) {
var errObj = {
0: "Unkonown Error",
1: "Permission denied by User",
2: "Position is not available",
3: "Request Timed Out"
}
reject(`${err.code} ${errObj[err.code] }`);
});
});
}
cordinats().then(function(location) {
var loc = location;
console.log(loc);
changeHtmlInfo(loc);
}, function(error) {
console.log(error);
});
Сборка персонального компьютера от Artline: умный выбор для современных пользователей