记一个年久失修的 Chrome Alarms Bug

在 Chrome 插件的开发中,我们遇到了需要定时提醒的功能,Chrome 官方推荐的 Alarms + 事件页面的做法,之前我也发过:Chrome 插件开发:Alarms 定时与事件页面,起到了计划任务的效果,但是后来我们发现了一个奇怪的问题:计划任务有时执行,有时不执行,有时会延迟执行,而且延迟可以多达几个小时。

这个 bug 很奇怪,最初收到反馈是最近一个星期,我以为是最新更新了什么代码,结果看了一下 Git Log 并没有改动这一段代码,也没有增加其他 Chrome 提供的 API 的调用,理论上是不受影响的。

此时我开始怀疑是最新 Chrome 引入的 Bug,正巧家里的电脑用的是旧大概一两个月的 Chrome,测试也复现了这个问题,而且摸不准复现情况。

Google 了一番,还是没有定位到问题,不过可以看到,是当时根本没有触发 addListener 注册的监听,此时夜已深,倍感无聊,生无可恋,刷起了 Stack Overflow,最终在一个几年前的提问中找到了问题:Chrome extensions alarms on system stanby

之后发现是一个 Chrome.alarms 在休眠后产生的 Bug,在2015 年时就有人提出,然而至今未修复。

有一个应急的解决方案,通过 chrome.idle 监听并且重新注册可解:

chrome.idle.onStateChanged.addListener(newState => {
  if (newState === 'active') {
    chrome.alarms.getAll(items => {
      items.forEach(item => {
        const params = {};
        if (item.when) params.when = item.scheduledTime;
        if (item.periodInMinutes) params.periodInMinutes = item.periodInMinutes;
        chrome.alarms.create(item.name, params);
      });
    });
  }
});

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 知识, 代码段, Chrome插件

添加新评论