SetInterval должен быть запущен всякий раз, когда время меняется? - PullRequest
0 голосов
/ 07 мая 2019

Я использую setInterval для обновления времени, для этого я установил 60000s как интервал. всякий раз, когда я загружаю страницу, я получаю время и время обновляется через 1 минуту после того, как я обновил страницу, но не по времени. Следовательно, существует некоторая задержка в обновлении времени.

   const UpdateTime= (props) => {
    let date = new Date();
    const [dateTime, setDateTime] = useState({
        curTime: date.toLocaleDateString(),
        timeStr: date.toLocaleTimeString().replace(/:\d{2}\s/, " "),
        curDay: date.toLocaleDateString("en-US", { weekday: "short" })
    });
    useEffect(() => {
        const interval = setInterval(() => {
            let date = new Date();
            setDateTime({
                curTime: date.toLocaleDateString(),
                timeStr: date.toLocaleTimeString().replace(/:\d{2}\s/, " "),
                curDay: date.toLocaleDateString("en-US", { weekday: "short" })
            });
        },
            60000
        );
        return () => { clearInterval(interval) }
    }, [])
}

после загрузки страницы, когда date.getSeconds () достигает значения 00, я должен вызвать функцию setinterval.

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Я использовал setTimeOut для вызова функции интервала всякий раз, когда date.getSeconds () становится 0 в первый раз.Но проблема, с которой я сталкиваюсь, заключается в том, что я не смог очистить интервал.Я получаю больше «внутреннего тайм-аута и внутреннего интервала» в консоли, он не очищает предыдущий журнал, я ожидаю, что тайм-аут будет один, и всякий раз, когда запускается setInterval, я должен получить «внутренний интервал» в консоли

const DateTime = (props) => {
let date = new Date();
let initialDiff = (date.getSeconds() == 0) ? 0 : (59 - date.getSeconds());
setTimeout(() => {
    triggerDateUpdate()
    console.log("inside timeout")

}, initialDiff * 1000);
const [dateTime, setDateTime] = useState({
    curTime: date.toLocaleDateString(),
    timeStr: date.toLocaleTimeString().replace(/:\d{2}\s/, " "),
    curDay: date.toLocaleDateString("en-US", { weekday: "short" })
});
const interval = () => {
    console.log("inside interval")
    let date = new Date();
    setDateTime({
        curTime: date.toLocaleDateString(),
        timeStr: date.toLocaleTimeString().replace(/:\d{2}\s/, " "),
        curDay: date.toLocaleDateString("en-US", { weekday: "short" })
    });
}
let triggerDateUpdate = () => {
    interval();
    setInterval(() => {
        interval();
    }, 60000)
}
0 голосов
/ 07 мая 2019

Что ж, если вы хотите пойти по этому пути, я думаю, что нет другого решения, кроме этого:
Поскольку вы не можете 'запускать' интервалы, просто имитируя это ( Как вызвать функцию setInterval наклик пользователя? ), вы можете использовать функцию, которая будет вызываться через интервал.Затем вы можете вызвать эту функцию, когда date.getSeconds() достигнет 00. Однако для этого вам понадобится второй интервал, который срабатывает каждую секунду, пока не достигнет 00, и затем вы сможете очистить его.После того, как вы вызвали его, а второе - 00, вы устанавливаете интервал на 60 секунд.
Необходимо сбросить интервал 60 с, иначе он снова будет неточным.

...