У меня есть экранный компонент, который имеет функцию getPosition()
, вызываемую каждую секунду с интервалом.
Если вызывается функция stopRace()
или если пользователь нажимает физическую / графическую кнопку возврата, я хочу очистить этот интервал, чтобы он не продолжал работать в фоновом режиме.
Для этого я попытался сохранить идентификатор интервала в переменной состояния raceUpdateInterval
.
I затем очистите этот интервал, используя clearInterval(raceUpdateInterval)
в функции stopRace()
и функции cleanup()
.
Когда я вызываю функцию stopRace()
, затем нажимаю назад, интервал очищается. Я знаю это, потому что моя консоль регистрирует:
Still Running
Still Running
Still Running
Reached cleanup function
Однако, если я нажимаю кнопку возврата, интервал не очищается. Вместо этого моя консоль записывает в журнал:
Still Running
Still Running
Still Running
Reached cleanup function
Still Running
За этим следует предупреждение об утечке памяти, содержащее следующий совет:
To fix, cancel all subscriptions and asynchronous tasks in %s.%s, a useEffect cleanup function
Это именно то, что я пытаюсь сделать, но не работает для некоторые причины за пределами моего понимания.
Вот соответствующий код для компонента:
const RaceScreen = ({route, navigation}) => {
const [raceUpdateInterval, setRaceUpdateInterval] = useState(0);
useEffect(function() {
return function cleanup() {
console.log('Reached cleanup function')
clearInterval(raceUpdateInterval)
}
}, []);
function getPosition(){
console.log("Still being called")
//get position
}
function startRace(){
setRaceUpdateInterval(setInterval(getPosition, 1000))
}
function stopRace(){
clearInterval(raceUpdateInterval)
}
Почему функция stopRace()
правильно очищает интервал, а функция cleanup()
- нет