Как удалить несколько setIntervals из useEffect

Я загружаю несколько животных в свой проект ThreeJS. У всех этих животных есть PositionalAudio с функцией setInterval. Я использую их внутри функции useEffect. При обратном вызове я хочу очистить интервал, но он продолжает вызывать функцию.

Это функция, в которой я устанавливаю свой setInterval:

const loadAudio = () => { 
  const animalSound = new THREE.PositionalAudio(listener);
  animalSound.setBuffer(animalBuffer);
  playSounds = setInterval(() => {
    animalSound.play();   
  } , 5000);
  audios.push(animalSound);
}

В функции возврата я пытаюсь очистить интервал:

return () => {
  audios.forEach((audio) => {
    audio.stop();
    clearInterval(playSounds);
  });
};

К сожалению, звук продолжает воспроизводиться каждые 5 секунд.

Вот фрагмент кода

https://codesandbox.io/s/bitter-tree-bb4ld?file=/src/App.js

не могли бы вы добавить весь фрагмент кода useEffect.

Abu Sufian 09.12.2020 20:22

@AbuSufian Я сделаю фрагмент кода

Sven Z 09.12.2020 20:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
2
483
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Согласно вашему фрагменту кода, скажем, у вас есть кнопка:

  <button
    onClick = {buttonToggle}
    >
    {start ? 'start' : 'stop'}
  </button>

Изначально у нас есть некоторая настройка для useState и функция обработки щелчка.

  const [seconds, setSeconds] = useState(0);
  const [btnStart, setBtnStart] = useState(true);
  
  const buttonToggle = useCallback(
    () => setBtnStart(run => !run)
  , []);

В useEffect вы сделаете следующие изменения

  useEffect(() => {
    if (!btnStart) {
      // setSeconds(0); // if you want to reset it as well
      return;
    }
    
    const interval = setInterval(() => {
      setSeconds(seconds => seconds + 1);
    }, 1000);
    return () => clearInterval(interval);
  }, [btnStart]);

Другие вопросы по теме