Динамическая задержка setInterval в useEffect вызывает бесконечный цикл

#reactjs

#reactjs

Вопрос:

Мне действительно нужна помощь в этом вопросе. Я пытался исследовать это в течение целого дня, но, похоже, у меня ничего не получается.

Итак, в основном у меня есть компонент, который должен отображать данные на основе заданных секунд в функции setInterval. Таким образом, секунды задержки будут динамическими в зависимости от того, что устанавливает пользователь (я называю это частотой обновления). Используя useEffect, я извлекаю указанную частоту обновления с помощью api, визуализирую api с помощью useEffect hook и сохраняю res.data в состояние

   const [refreshRate, getRefreshRate] = useState(0);

  useEffect(_ => {
    axios
    .get("/api/.../refreshRate")
    .then(res => {
         getRefreshRate(res.data)
       })
    .catch((err) => console.log(err));

  },[])
 

Затем мне нужно установить, что частота обновления равна секундам задержки для функции setInterval, которая будет использоваться для продолжения рендеринга данных на основе частоты обновления, установленной пользователем.

 const [refreshRate, getRefreshRate] = useState(0); // the refresh rate
const [data, getData] = useState([]); // The data that needs to re-render depending in the refreshRate State

useEffect(_ => {
 axios
    .get("/api/.../refreshRate")
    .then(res => {
         getRefreshRate(res.data)
       })
    .catch((err) => console.log(err));

},[])

useEffect(_ => {
   const interval = setInterval(_ => {
       axios
        .get("/api/.../getData")
        .then(res => {
             getData(res.data)
           })
        .catch((err) => console.log(err));
},refreshRate)

   return _ => {
    clearInterval(interval)
}
  },[])
 

Но в результате это приводит к бесконечному циклу в приложении. Я также пытался использовать Redux, с той же логикой я сохраняю частоту обновления в глобальном состоянии, пытался установить ее в секундах задержки функции setInterval, но все равно вызывает бесконечный цикл. Есть ли какой-нибудь способ исправить или улучшить это?

Комментарии:

1. Может быть, попробовать setTimeout вместо setInterval ?

2. Я не уверен, что это ваша проблема, но, похоже, вы инициализируете частоту обновления с 0, что означает, что каждые 0 секунд он будет отправлять запрос. попробуйте изменить его на 5 секунд и посмотрите, сохраняется ли проблема. const [refreshRate, getRefreshRate] = useState(5000);

3. @ThomazCapra Будь ты проклят, твое право. Похоже, причина, по которой это выглядит как бесконечный цикл, заключается в том, что секунды задержки в setInterval установлены только на МИЛЛИСЕКУНДЫ. Пример: пользователь установил частоту обновления на 8 секунд. Когда я пытаюсь получить api для частоты обновления. Он устанавливает задержку на 8 МИЛЛИСЕКУНД, а не на 8000 МИЛЛИСЕКУНД. Спасибо, чувак. Это должно это исправить. Вы можете опубликовать свой ответ, чтобы другие могли его просмотреть, если они столкнутся с этой небольшой ошибкой..

4. @ThomazCapra Это не решит проблему, потому что, если OP установит начальное значение refreshRate to 5000 , setInterval оно будет выполняться каждые 5 секунд, но обновленное значение refreshRate , которое извлекается в результате HTTP-запроса, не будет иметь никакого эффекта. Проблема здесь заключается в отсутствующей зависимости useEffect hook, а не в начальном значении refreshRate .