打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
不要覆盖标准方法

需求:

页面不可见时,例如切换浏览器页签、最小化浏览器,暂停所有定时器;页面显示时,再启动定时器。


一个解决方案如下:

const uuid = (() => {
  let no = 0;
  return () => no++;
})();

const originSetInterval = window.setInterval;
const originClearInterval = window.clearInterval;

const timers = [];
const startTimers = () =>
  timers.forEach(t => {
    t.originIntervalId = originSetInterval(
      t.fn,
      t.ms
    );
  });
const stopTimers = () =>
  timers.forEach(t => {
    originClearInterval(t.originIntervalId);
  });

document.addEventListener(
  "visibilitychange",
  () =>
    document.visibilityState === "visible"
      ? startTimers()
      : stopTimers()
);

window.setInterval = (fn, ms) => {
  const originIntervalId =
    document.visibilityState === "visible"
      ? originSetInterval(fn, ms)
      : undefined;
  const id = uuid();
  timers.push({
    fn,
    ms,
    originIntervalId,
    id
  });
  return id;
};

window.clearInterval = id => {
  const t = timers.find(t => t.id === id);
  originClearInterval(t.originIntervalId);
  timers.splice(timers.indexOf(t), 1);
};

覆写 setIntervalclearInterval,不用改已有代码,所有定时器就都能自动启停。


但我不推荐在项目中这么做,宁愿麻烦点,写个 setSmartInterval ,全局替换 setInterval。原因有很多,例如:

  • 可能影响第三方库
  • 没法再用原生的 setInterval
  • 新人培训成本增加
  • ……

其中,我最看重的是:这么做导致 代码行为出人意料。当一个东西和经验认知不一样时,使用它要付出更多的思考。「Don't make me think」对于代码设计同样重要。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【分享】JS事件触发延迟
js setInterval() 方法
setInterval和setTimeout停止的方法(2014-06-30)
setInterval设置停止和循环
JS setInterval() 与 clearInterval() 方法的使用
通达信趋势线公式
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服