【问题标题】:SetInterval has to be triggered whenever the time is getting changed?每当时间改变时都必须触发 SetInterval?
【发布时间】:2019-05-07 07:34:31
【问题描述】:

我使用 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 函数。

【问题讨论】:

    标签: javascript jquery reactjs date react-hooks


    【解决方案1】:

    好吧,如果你想这样走,我想除了这个没有其他解决方案:
    因为你不能仅仅模拟它来“触发”间隔(How to trigger a setInterval function on a user click?),所以你可以使用间隔调用的函数。然后您可以在date.getSeconds() 达到 00 时调用该函数。但是为此,您需要一个每秒触发的第二个间隔,直到它达到 00,然后您才能清除它。在你调用它并且第二个是 00 之后,你将间隔设置为 60 秒。
    需要重新设置60s的间隔,否则会再次不准确。

    【讨论】:

      【解决方案2】:

      每当 date.getSeconds() 第一次变为 0 时,我使用 setTimeOut 调用间隔函数。但我面临的问题是我无法清除间隔。我在控制台中获得了更多的“内部超时和内部间隔”,它没有清除以前的日志,我希望超时为一个,每当 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)
      }
      

      【讨论】:

        猜你喜欢
        • 2018-05-07
        • 2011-05-21
        • 2019-05-12
        • 1970-01-01
        • 2016-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-09
        相关资源
        最近更新 更多