Вопрос с promises в JavaScript

226
11 августа 2017, 01:07
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) вообще не выполняется. Вопрос:

  1. почему такая последовательность выполнения кода
  2. Почему не выполняется cordinats().then
Answer 1

Почему не работало?

Метод 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);
});
READ ALSO
Как составить регулярное выражение js?

Как составить регулярное выражение js?

Здравствуйте, помогите составить регуляркуЕсть строка, если в строке например есть 453|571 то взять все что до " " (пробела)

207
Получение и вставка значения элемента с использованием делегирования

Получение и вставка значения элемента с использованием делегирования

Написал следующий код для получения значения из input и вставки этого значения в label и в обратном порядкеНо почему то происходит сбрасывание...

227
Как сделать чтобы ячейка не создавалась если она пустая

Как сделать чтобы ячейка не создавалась если она пустая

Подскажите как сделать так что если нету значения в ячейке mtimein то не создается ячейка если значение есть то ячейка создается и выводит содержимое,...

372
Маршрутизация в React js и PHP

Маршрутизация в React js и PHP

Пожалуйста, объясните как работает маршрутизация в реакте, если я использую обычный phpТо есть просто на main

392