Javascript recursive setTimeout не использует обновленные значения

#javascript #reactjs #react-native

#javascript #reactjs #react-native

Вопрос:

Я пытался работать с setInterval для увеличения индикатора выполнения, но проблема в том, что, поскольку я использую React Native, поток JS не может выполнить все мои анимации, пока не завершится задача индикатора выполнения.

Итак, вот почему я пытаюсь выполнить ту же операцию с рекурсивным setTimeout, но проблема в том, что он, похоже, использует глобальный контекст (не уверен, но данные не обновляются)… Вот что я делаю:

   const [timerProgress, setTimerProgress] = useState(0);

  const advanceTimer = () => {
    setTimeout(() => {
      setTimerProgress(timerProgress   1 / 30); // <-------- timerProgress seems to be not updated (most of the times is 0) when recursion
      if (timerProgress < 1) {
        advanceTimer();
      }
    }, 1000);
  };

  useEffect(() => {
    if (rival) {
      // When a new rival is found, we stop the 'fetching' action
      setIsFetching(false);

      // Only update the timer if there is a rival
      advanceTimer();
    }
  }, [rival]);
  

Есть идеи, как это решить?

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

1. timerProgress всегда находится в «глобальном» контексте.

Ответ №1:

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

 useEffect(() => {
  console.log(timerProgress);
}, [timerProgress])
  

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

1. Хорошо, спасибо, похоже, мне придется использовать useEffect или передавать самое последнее значение в качестве аргумента для вызовов рекурсии.

2. Вы также можете использовать пользовательский хук для решения этой проблемы. Просто передайте обратный вызов, в котором вы выполняете свой вызов условной рекурсии, в useStateWithCallback . robinwieruch.de/react-usestate-callback