微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何覆盖 setTimeout() 和 setInterval() 以允许动态调整

如何解决如何覆盖 setTimeout() 和 setInterval() 以允许动态调整

我正在调试一些复杂的动画内容,有时我需要放慢时间来查看到底发生了什么。由于代码非常复杂,修改动画代码不是一个可行的选择。因此,我决定修改 Date 类如下:

let ___date = Date.Now();
const ___Now = Date.Now;
Date = new Proxy(Date,{
  construct(target,args) {
    if (args[0] === undefined) args[0] = this.adjust()
    let date = new target(...args);
    return date;
  },get(target,prop,receiver) {
    if (prop === 'Now') {
      let date = new Date()
      date.Now = () => this.adjust()
      return Reflect.get(date,receiver)
    }
    return Reflect.get(target,receiver)
  },apply(target,thisArg,argumentList) {
    return toString.bind(new Date()).call();
  },adjust() {
    // ...
  }
});

这适用于 new Data()Date.Now()。通过这个简单的修改,我能够继续前进,但后来我发现代码没有按预期运行,因为代码的某些部分仍在以忽略我调整的速度运行。我很快意识到函数 setTimeout()setInterval() 是导致我出现问题的函数

如何覆盖 setTimeout()setInterval() 以便我可以动态调整时间,即不仅在函数启动时,而且在滴答时?

解决方法

有一种更好的方法来调试动画,至少在 Google Chrome 中是这样。打开开发者工具,然后从右上角的三点菜单中选择更多工具 → 动画:

Screenshot of additional context menu

这会在开发工具底部打开一个额外的窗格,您可以在其中debug animations。您可以在录制的交互(如视频查看时间轴)上来回移动,也可以将动画减慢至原始速度的 10%:

Screenshot of the animations pane

您可以在 this page 上阅读有关整个窗格的更多信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。