Как можно отключить <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); } })