You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Chrome扩展Manifest V3 Service Worker在macOS上setTimeout/setInterval出现异常延迟问题求助

Chrome扩展Manifest V3 Service Worker在macOS上setTimeout/setInterval出现异常延迟问题求助

我最近遇到了一个非常诡异的问题,和Chrome扩展Manifest V3的Service Worker有关,想请教大家有没有类似的排查思路或者解决方案。

最开始我实现了一个常规的sleep函数:

async sleep (ms: number) {
    return new Promise(resolve => setTimeout(resolve, ms))
}

问题详情

这个函数在内容脚本、Chrome开发者控制台里运行都很正常,但只有在Mac的Service Worker中执行时,延迟会变得完全随机——有时候接近设定的ms值,有时候偏差大到离谱,比如设500ms实际等了5000ms左右。更奇怪的是:

  • Windows上用同版本Chrome(131)完全没有这个问题
  • 这个异常是最近才出现的(大概在2024年8-12月之间),之前两年多时间里都运行正常
  • 延迟的偏差幅度已经远超出JS定时器本身的正常精度误差,所以我怀疑是有外部因素在干扰

进一步测试:排除Service Worker闲置的可能

为了确认是不是Service Worker被闲置后重新激活导致的延迟,我在Service Worker里加了这段测试代码:

self.addEventListener('activate', () => {
  console.log('+++++++++++++ Service Worker activated')
})

var lastHeartbeat = Date.now()
setInterval(() => {
  const now = Date.now()
  console.log(`${now - lastHeartbeat}ms`)
  lastHeartbeat = now
}, 100);

日志里除了首次加载扩展时的激活记录,之后再也没有新的激活日志,这说明Service Worker没有被闲置重启。但setInterval的执行间隔依然完全随机,比如这段采样日志:

101ms, 99ms, 2055ms, 100ms, 3511ms, 394ms, 1416ms, 4439ms, 1341ms, 2862ms, 1216ms, 1794ms,
 1885ms, 802ms, 303ms, 405ms, 77ms, 100ms, 367ms, 34ms, 1348ms, 52ms, 99ms

有时候甚至会出现10秒级的延迟,看起来像是事件循环被什么东西阻塞或者拖慢了?

其他尝试

我考虑过用chrome.alarms替代定时器,但它在生产环境下精度只能到分钟级,开发环境也只有秒级,完全满足不了我的需求。

有没有朋友遇到过类似的Mac Chrome Service Worker定时器异常的情况?或者有没有什么Chrome的版本更新、Mac系统的变化可能导致这个问题?


备注:内容来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:23:06