Выбор ответа Junior Память и сборка мусора спрашивают часто обновлено

Утечка через setInterval в компоненте

Вопрос

Что не так с этим эффектом?

useEffect(() => {
  setInterval(() => {
    fetchStatus().then(setStatus);
  }, 5000);
}, []);

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Интервал не очищается после размонтирования: нужно вернуть () = clearInterval(id). React не знает о таймерах, созданных внутри эффекта: убрать их должна функция очистки, которую эффект возвращает.

Варианты ответа

  1. Ничего: React сам очистит все таймеры компонента при размонтировании
  2. setInterval нельзя вызывать внутри useEffect, только в обработчиках
  3. Интервал запустится только один раз, потому что зависимости пустые []
  4. Интервал не очищается после размонтирования: нужно вернуть () => clearInterval(id)правильный ответ

Разбор

React не знает о таймерах, созданных внутри эффекта: убрать их должна функция очистки, которую эффект возвращает. Без неё интервал живёт вечно, делает лишние запросы, держит колбэк и всё, что он замыкает, а в режиме разработки StrictMode запускает эффект дважды, и интервалов станет два. Вызывать таймеры в эффекте можно и нужно. Интервал срабатывает многократно, а не один раз.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.