JavaScript倒计时不准确,你们在项目中如何处理的?难道前端要每秒请求一次接口?

JS倒计时不准确,你们在项目中如何处理的?难道前端要每秒请求一次接口?

让PHP再次伟大
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 26
slowlyo

一般来说 js 控制的倒计时就只是个展示效果, 给用户看的 (就图一乐), 真正的需要倒计时控制的逻辑都是在服务端实现, 比如 超时未支付自动取消订单/超时未使用 等... 不用考虑展示的倒计时的准确性 (不要差的太离谱就行, 差一两秒是正常的), 只需要在倒计时结束, 请求你的接口, 然后刷新数据就行了

1年前 评论
slowlyo (作者) 1年前
勇敢的心 (楼主) 1年前
勇敢的心 (楼主) 1年前

用本地时间修正呀,比如这样:

    //js倒计时函数
    function timeout(second,callback){
        let start_time=(new Date()).getTime();
        let t = setInterval(function(){
            if((new Date()).getTime()-start_time>second*1000){
                callback();
                clearInterval(t);
            }
        },100);
    }

    //调用示例:5秒后执行
    timeout(5,function () {
        console.log('时间到啦');
    });
1年前 评论
勇敢的心 (楼主) 1年前
renxiaotu (作者) 1年前
勇敢的心 (楼主) 1年前
renxiaotu (作者) 1年前
deatil 1年前
renxiaotu (作者) 1年前
deatil 1年前

定时请求API校准倒计时散 前端的不可控因数多

1年前 评论
勇敢的心 (楼主) 1年前

js的时钟就是用户端的时钟吧,都是一样的。如果说操作多了,出现问题,那你得看下代码是不是有问题了

1年前 评论

一般是后端返回一个当前的时间戳,然后前端再进行倒计时处理,不要通过前端直接获取当前时间

1年前 评论
勇敢的心 (楼主) 1年前
kkokk (作者) 1年前
kkokk (作者) 1年前
cnguu

首先,js是单线程的,无法消除误差,前端能做的只能是减少误差

然后,可以 setTimeout 系统时间补偿入手

简单的代码:

/**
 * 比较稳定地计数
 * @param fn 自定义函数
 * @param speed
 */
const superSetTimeout = (fn, speed) => {
  fn();

  let counter = 1;
  let start = new Date().getTime();

  const main = () => {
    fn();

    let ideal = counter * speed;
    let real = new Date().getTime() - start;

    counter++;

    const diff = real - ideal;

    setTimeout(() => {
      main();
    }, speed - diff); // 通过系统时间进行修复
  };

  setTimeout(() => {
    main();
  }, speed);
};

superSetTimeout(() => {
  console.log(new Date());
}, 1000);

网上也有很多类似代码

1年前 评论

和浏览器策略有关的,你离开页面浏览器会自动减慢计时,有的甚至会暂停计时

1年前 评论

每30秒和前端同步一下时间

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!