Chrome 扩展服务工作者:MacOS 上的 setTimeout() / setInterval() 出现异常延迟

问题描述 投票:0回答:1

清单:V3

我最初实现了一个睡眠功能:

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

问题: (仅)当从我的 Chrome 扩展程序的服务工作线程运行时,延迟是随机的。有时非常接近 ms 参数,有时非常接近(例如:~5000ms 而不是 500ms)。 但仅限于 Mac。在 Windows 上,这种情况不会发生(同一版本的 Chrome:131)。

我知道时间永远无法保证,但这个问题不仅只发生在服务工作线程中(在内容脚本或 chrome 开发控制台中工作正常),而且这种情况最近才开始发生(2024 年 8 月至 12 月之间的某个时间) )并且仅在 Mac 上,虽然在此之前它工作正常大约 2 年,所以加上如此巨大的延迟差异,我怀疑还有其他问题发生。

然后出于测试目的,我在 Service Worker 中添加了以下代码,并使用 setInterval() 代替:

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);

我没有看到任何激活(除了第一次启动 Chrome 扩展程序之外),这排除了服务工作人员空闲/重新激活的可能性,但延迟完全是随机的,这是一个随机样本:

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 来代替,但不幸的是,这只能在产品模式下精确到分钟(或在开发模式下精确到秒),而不是更少,这对我来说不起作用。

也许这是最近 chrome 更新后发生的变化..

有什么想法吗? 唯一一个有点相似的帖子是thisone,但不幸的是它并没有真正解决问题,而且已经有 6 年历史了。

编辑 2025-01-10:这个问题实际上只发生在 mac(intel CPU - Sequoia OS)上,在 Windows(10)上没有问题(相同/最新版本的 Chrome:131)

javascript macos service-worker chrome-extension-manifest-v3
1个回答
0
投票

我在 Mac OS Sonoma 上使用 Chrome 128 时遇到了类似的问题。当 Javascript 控制台上已经存在错误时,就会发生这种情况。 如果控制台中没有错误,此代码将按预期工作

async awaitSync(){
    let count = 0;
    let intervalId = setInterval(() => {
      console.log(count);
      count++;
      if(count > 10){
        clearInterval(intervalId);
      }
    }, 1000);
  }

一旦控制台出现错误,时间就会改变,1000不再是一秒,而是像2分钟左右。

© www.soinside.com 2019 - 2024. All rights reserved.