Функция navigator.geolocation.getCurrentPosition приводит к неопределенности при вызове за пределами локальной области видимости.

Как я могу получить доступ к объекту обратного вызова успеха navigator.geolocation.getCurrentPosition вне функции при ее вызове?

Допустим, у меня есть функция в файле (называемая UserLoc), которую я экспортирую.

export const locateCurrentPosition = () => {
  const currentPosition = navigator.geolocation.getCurrentPosition(
    position => {
      console.log(position);
      return position;
    },
    error => {
      console.log(error.message);
      return error;
    },
    {
      enableHighAccuracy: true,
      timeout: 10000,
      maximumAge: 1000
    }
  );

  return currentPosition;
};

Теперь в одном из моих компонентных js-файлов я хочу вызвать эту функцию внутри componentDidMount().

const {
  locateCurrentPosition
} = require("../Views/components/User/UserMap/UserLoc");

async componentDidMount(){

console.log(locateCurrentPosition())
locateCurrentPosition().then(data=>console.log(data))
}

Когда я вызываю функцию внутри моего componentDidMount, она всегда возвращает значение undefined. Когда я регистрирую это, он выводит позицию внутри локальной области (т.е. первый блок кода выше, где я использую console.log(position). Каков наилучший способ получить объект позиции из успешного обратного вызова и вернуть его в мой компонентDidMount при вызове?

Я пробовал обещания, затем операторы с моим консольным журналом, а также различные типы возвратов, но мне всегда кажется, что я не определен. Операторы возврата в функции locateCurrentPosition не работают. Какие-либо предложения?


person Ray    schedule 03.12.2019    source источник


Ответы (1)


Добавлена ​​стрелка после нового обещания ((разрешить, отклонить)

navigator.geolocation.getCurrentPosition возвращает undefined, значение, возвращаемое при вызове locateCurrentPosition. Позиция передается только обратному вызову, указанному в вызове, который при необходимости можно превратить в обещание:

export const locateCurrentPosition = () => new Promise((resolve,reject)=> {
  navigator.geolocation.getCurrentPosition(
    position => {
      console.log(position);
      resolve(position);
    },
    error => {
      console.log(error.message);
      reject(error);
    },
    {
      enableHighAccuracy: true,
      timeout: 10000,
      maximumAge: 1000
    }
  );
});

и вызывается с помощью

locateCurrentPosition().then(position=>console.log(position))

См. также Как вернуть ответ на асинхронный вызов

person traktor    schedule 04.12.2019
comment
Спасибо, это отлично работает. Одна небольшая модификация. Я получал синтаксическую ошибку из-за отсутствия =›. Я опубликую ответ ниже. Спасибо за помощь. Я не слишком знаком с обещаниями. Я пытался использовать ожидания и асинхронность, потому что думал, что они похожи на промисы, но мне не повезло. - person Ray; 04.12.2019
comment
Исправление, я отредактировал ваш пост, чтобы показать недостающую стрелку. Спасибо еще раз. - person Ray; 04.12.2019