Выбор ответа Junior Память и сборка мусора спрашивают часто обновлено
Утечка через setInterval в компоненте
Вопрос
Что не так с этим эффектом?
useEffect(() => {
setInterval(() => {
fetchStatus().then(setStatus);
}, 5000);
}, []);
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Интервал не очищается после размонтирования: нужно вернуть () = clearInterval(id). React не знает о таймерах, созданных внутри эффекта: убрать их должна функция очистки, которую эффект возвращает.
Варианты ответа
- Ничего: React сам очистит все таймеры компонента при размонтировании
setIntervalнельзя вызывать внутриuseEffect, только в обработчиках- Интервал запустится только один раз, потому что зависимости пустые
[] - Интервал не очищается после размонтирования: нужно вернуть
() => clearInterval(id)правильный ответ
Разбор
React не знает о таймерах, созданных внутри эффекта: убрать их должна функция очистки, которую эффект возвращает. Без неё интервал живёт вечно, делает лишние запросы, держит колбэк и всё, что он замыкает, а в режиме разработки StrictMode запускает эффект дважды, и интервалов станет два. Вызывать таймеры в эффекте можно и нужно. Интервал срабатывает многократно, а не один раз.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.