Как можно отключить <code>navigator.geolocation.watchPosition()</code>? У меня есть метод, который запускает отслеживание местоположения по нажатию кнопки. Мне нужно, чтобы это отслеживание отключалось после размонтирования компонента. Я пробовал использовать <code>navigator.geolocation.clearWatch()</code>, но столкнулся с проблемой, так как не могу получить идентификатор отслеживания должным образом. Отслеживание должно начинаться только по нажатию кнопки, поэтому я не реализовал это так: <br/> <pre><code class="javascript">const id = navigator.geolocation.watchPosition((position) => { const { latitude, longitude } = position.coords; continousCoordinates.value = [ longitude, latitude ] }, error, options); onUnmounted(() => { navigator.geolocation.clearWatch(id); })</code></pre> <br/> Вот как выглядит мой код: <br/> <pre><code class="javascript">// Метод включения наблюдения const getContinuousPosition = () => { const id = navigator.geolocation.watchPosition((position) => { const { latitude, longitude } = position.coords; continousCoordinates.value = [ longitude, latitude ] }, error, options); return id; }; // Общий метод с помощью которого всё срабатывает const postImmediate = () => { getContinuousPosition(); // Http запрос store.postImmediateTask(user.value!.phone, user.value!.fullname, currDate, continousCoordinates.value!) }; // Если изменяются координаты, то отправляет http запрос watch(continousCoordinates, (newValue) => { if (newValue) { store.patchImmediateTask(user.value!.fullname, newValue); } }) // Прекращение наблюдения при размонтировании onUnmounted(() => { navigator.g
Ваша проблема заключается в том, что вы не сохраняете идентификатор вызова `watchPosition` в доступном для функции `onUnmounted` контексте. Чтобы исправить это, вам нужно хранить идентификатор в области видимости, к которой можно получить доступ вне функции `getContinuousPosition`. Вот пример, как можно реализовать сохранение идентификатора и корректное выключение наблюдения при размонтировании компонента: ```javascript let watchId; // Определяем переменную для идентификатора наблюдения // Метод включения наблюдения const getContinuousPosition = () => { // Сохраняем идентификатор в переменной watchId watchId = navigator.geolocation.watchPosition( (position) => { const { latitude, longitude } = position.coords; continousCoordinates.value = [ longitude, latitude, ]; }, error, options ); }; // Общий метод с помощью которого всё срабатывает const postImmediate = () => { getContinuousPosition(); // Http запрос store.postImmediateTask(user.value!.phone, user.value!.fullname, currDate, continousCoordinates.value!); }; // Если изменяются координаты, то отправляет http запрос watch(continousCoordinates, (newValue) => { if (newValue) { store.patchImmediateTask(user.value!.fullname, newValue); } }); // Прекращение наблюдения при размонтировании onUnmounted(() => { if (watchId) { navigator.geolocation.clearWatch(watchId); // Используем сохраненный идентификатор } }); ``` В этом коде: 1. Мы объявляем переменную `watchId` вне функции `getContinuousPosition`, чтобы она была доступна во всей области видимости. 2. В функции `getContinuousPosition`, мы назначаем идентификатор, возвращаемый `watchPosition`, переменной `watchId`. 3. В `onUnmounted`, мы проверяем, существует ли `watchId`, и если да, то вызываем `navigator.geolocation.clearWatch(watchId)`, чтобы остановить отслеживание местоположения. Таким образом, остается возможность корректно отключить наблюдение за местоположением при размонтировании компонента.
Вынеси id из функции
let id; const getContinuousPosition = () => { id = navigator.geolocation.watchPosition((position) => { const { latitude, longitude } = position.coords; continousCoordinates.value = [ longitude, latitude ] }, error, options); }; ... onUnmounted(() => { if(id){ navigator.geolocation.clearWatch(id); } })