Сделать функцию в HTML/JavaScript в геолокации более линейной


Я проверяю местах пользователей с HTML геолокации, прежде чем открывать входную дверь. Геолокация занимает несколько секунд, в дополнение к времени требуется пользователю, чтобы его утвердить, так что в настоящее время у меня есть обратного вызова, что делать дальше.

function getLocationWithCallbacks(callback, error_callback) {
  navigator.geolocation.getCurrentPosition(
      function (position) {
        let location = { "latitude": position.coords.latitude, "longitude": position.coords.longitude };
        callback(location);
      },
      function (error) {
        if (error.code === error.PERMISSION_DENIED)
          error_callback()
      }
  )
}

И я называю эту функцию, как так..

getLocationWithCallbacks(unlock_request, get_location_denied);

Однако, я не уверен, если есть более логичный путь, чем этот. Было бы неплохо, если бы события происходили в более линейном режиме, как ("псевдокод")...

function getLocation() {
  navigator.geolocation.getCurrentPosition(
   function(position) { return ['success', position] },
   function(error) { return ['failure', error] }
}

И вызывать его с помощью...

let response = getLocation();
response[0] === 'success' ? unlock_request(response[1]) : get_location_denied(response[1])

Однако я считаю, что это потребует добавления обещания и ждут заявлений, которые могли бы сделать оригинальный метод обратного вызова более желательным.

Я просто не уверен, что это самый чистый, самый логичный способ реализации функции, метод getlocation?



270
3
задан 2 февраля 2018 в 08:02 Источник Поделиться
Комментарии
1 ответ

Большинство собственных функций требуют обратного вызова вместо Promise потому что они поддерживают старые браузеры, так что вы должны сделать, это упаковать method в Promise

function getLocation() {
return new Promise(function(resolve, reject){
navigator.geolocation.getCurrentPosition(
function(position) { resolve(position); },
function(error) { reject(error); }
}
});
}

Теперь можем определить, что должно произойти с position и error.

const response = getLocation()
.then(position =>
( {"latitude": position.coords.latitude,
"longitude": position.coords.longitude} ))
.then(latLong => { unlock_request(latLong) },
error => { get_location_denied(error[1]) });

Вы знаете, что для этого request что вы хотите получить latitude и longitude из position так что вы просто возвращать новый object С longitude и latitudeсамое умное с обещания, что это строитель, но могу позвонить then снова и теперь параметр будет то, что было возвращено в последние thenтак вся власть дана response а не getLocation()

4
ответ дан 3 февраля 2018 в 02:02 Источник Поделиться