React Native - Как отложить запуск - PullRequest
0 голосов
/ 07 мая 2020

Привет всем, я пытаюсь сделать таймер обратного отсчета с множеством настроек, но моя первая проблема - как отложить его запуск.

Он начинается с 0 секунд и занимает немного времени, чтобы получить значение, которое я передал с предыдущей страницы

const CountDownScreen = ({route, navigation}) => {

  const meditationTime = route.params.time;

Я использую время

  const getMedTime = () => {
    let res = meditationTime;
    return new Promise(resolve => resolve(res));
  };

, чтобы указать время, которое я получу

const [timeToGive, setTimeToGive] = useState();


  useEffect(() => {
    const setTimeState = async () => {
      const getTime = await getMedTime();
      console.log('get time', getTime);
      // setGotTime(getTime);

      let timeToGive = {
        minutes: 0,
        seconds: getTime,
      };

      setTimeToGive(timeToGive);
    };
    setTimeState();

    updateTimer();
  }, []);

состояние с time

  const [time, setTime] = useState(
    {
      eventDate: moment.duration().add(timeToGive),
    },
  );

запускается таймер (я полагаю, после ОБЕЩАНИЯ)

  const updateTimer = () => {
    const x = setInterval(() => {
      let { eventDate } = time;

      if (eventDate <= 0) {
        clearInterval(x);
        sessionEnded();
      } else {

        eventDate = eventDate.subtract(1, 's');

        const mins = eventDate.minutes();
        const secs = eventDate.seconds();

        setTime({
          mins,
          secs,
          eventDate,
        });
      }
    }, 1000);
    setIntervalTime(x);
  };

Я пробовал много разных решений, но ни одно не помогло. Он всегда начинается поздно. Я бы хотел избежать setTimeout. Есть ли лучшая функция? Спасибо!

1 Ответ

0 голосов
/ 07 мая 2020

Это потому, что вы используете setInterval, который запускается только через 1 секунду (в вашем случае).

Вероятно, вам следует повторно адаптировать свой код и сделать что-то вроде этого:

  x(); // Call x once

  setInterval(() => {
   x(); 
  }, 1000); // Call x after every seconds

You может сохранить intervalId в состоянии, чтобы вы могли очистить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...