在vue中如何实现准时的setTimeout

概要

setTimeout 是不准的。因为 setTimeout 是一个宏任务,它的指定时间指的是:进入主线程的时间。

整体架构流程

当每一次定时器执行时后,都去获取系统的时间来进行修正,虽然每次运行可能会有误差,但是通过系统时间对每次运行的修复,能够让后面每一次时间都得到一个补偿。

技术细节

// 以下是vue2的写法

export default {
  data() {
   return {
     timeSetTimeout: null
  };

  timer() {
    var speed = 1000, // 设定间隔
    counter = 1, // 计数
    start = new Date().getTime();
    // 记录理想值 ideal
    // 记录真实值 real
    // 差值 diff
    let this_ = this
    function instance(){
        var real = (counter * speed),
        ideal = (new Date().getTime() - start);
        counter++;
        var diff = (ideal - real);
        this_.data.timeSetTimeout = window.setTimeout(function() { instance(); }, (speed - diff)); // 通过系统时间进行修复
        console.log(real/1000);
    };

    this.data.timeSetTimeout = window.setTimeout(function() { instance(); }, speed);
  },

 timer();


 beforeDestroy(){
   // 清理定时器
   clearTimeout(this.data.timeSetTimeout);
 }

},
// js写法
timer() {
    var speed = 1000, // 设定间隔
    counter = 1, // 计数
    start = new Date().getTime();
    // 记录理想值 ideal
    // 记录真实值 real
    // 差值 diff
    function instance(){
    var real = (counter * speed),
    ideal = (new Date().getTime() - start);
    counter++;
    var diff = (ideal - real);
    window.setTimeout(function() { instance(); }, (speed - diff)); // 通过系统时间进行修复
    console.log(real/1000);
    };

    window.setTimeout(function() { instance(); }, speed);
  },

小结

通过系统的时间补偿,能够让我们的 setTimeout 变得更加准时,至此我们完成了如何让 setTimeout 准时的探索。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值