首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关闭站点时setTimeout不同步

关闭站点时setTimeout不同步
EN

Stack Overflow用户
提问于 2022-09-15 12:23:57
回答 1查看 48关注 0票数 0

只要我保持打开窗口,setTimeout函数就可以与我的其他setTimeout函数保持一致。但是,如果我转到另一个选项卡/窗口,然后回到计时器,它将与其他倒计时不同步。

这是第一个定时器:

代码语言:javascript
复制
const [isDisabled, setIsDisabled] = useState(false);

    const handleOnClickUp = () => {
    setIsDisabled(true);
    setTimeout(() => setIsDisabled(false), 60000);}

第二定时器:

代码语言:javascript
复制
 const [counter, setCounter] = useState(60);

     if (isDisabled == true) {
    setTimeout(() => setCounter(counter - 1), 1000);
  }

  if (counter == 0) {
    setCounter(60);
  }

返回:

代码语言:javascript
复制
return (
    <>
      <div>{counter}</div>
      <button
        disabled={isDisabled}
        onClick={handleOnClickUp}
        className="bg-gray-500"
      >
        Up
      </button>
    
    </>
  );

TLDR:如何在没有问题的情况下同步两个定时器?

EN

回答 1

Stack Overflow用户

发布于 2022-09-15 13:18:41

当选项卡处于非活动状态时,Chrome和大多数其他浏览器具有低优先级的执行,即setCounter没有经常被调用。不久前,我遇到了一个类似的问题,然后转向使用requestAnimationFrame。

下面是React的示例代码:

代码语言:javascript
复制
const countDown = 30 * 1000;
const defaultTargetDate = new Date().getTime();

const [targetDate, setTargetDate] = useState(new Date(defaultTargetDate));

const [remainingSeconds, setRemainingSeconds] = useState(countDown / 1000);

const countItDown = () =>
  requestAnimationFrame(() => {
    const diff = Math.floor((targetDate - new Date().getTime()) / 1000);
    setRemainingSeconds(diff);
    if (diff > 0) {
      countItDown();
    }
  });

useEffect(() => {
  countItDown();
}, [targetDate]);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73731087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档