Chrome扩展:等待存储.同步获取远程数据

Chrome extension: wait for storage.sync to get remote data

本文关键字:程数据 数据 获取 扩展 等待 存储 同步 Chrome      更新时间:2023-09-26

我有一个扩展,读取带有时间戳的消息的提要并提醒用户。

我跟踪自用户打开消息以来的最高时间戳,低于该时间戳的任何内容都被"读取"。它工作得很好,但当用户安装了几个Chrome浏览器时,问题就开始了:他看到的是他已经在另一台机器上阅读过的内容。

输入"chrome.storage.sync API"。我可以设置实例间同步的最高时间戳,但这会给我带来竞争条件。

如果我在浏览器启动或从睡眠中唤醒后立即使用chrome.storage.sync.get,它将获得陈旧的本地数据,而不会等待同步发生-经过测试为真。因此,用户仍然是警报,即使在警报被清除之前的一小段时间-这是令人困惑的。

我可以检测扩展启动,我可以(某种程度上)检测从睡眠中醒来。甚至可能是离线/在线活动。但是我下一步该怎么做才能让Chrome有机会同步数据?一个简单的解决方案是:

var syncSleepTimeout = null;
function getUpAndRunning(){
  clearTimeout(syncSleepTimeout);
  syncSleepTimeout = null;
  doActualWork();
}
// Called upon wakeup/start/online event
function justWokeUp(){
  // Give sync a chance to happen
  syncSleepTimeout = setTimeout(getUpAndRunning, 3000);
}
chrome.storage.onChanged.addListener(function(changes, area){
  if(area === "sync" && syncSleepTimeout) getUpAndRunning();
});

据我所知,chrome.storage.sync不提供任何状态信息或事件,甚至不知道用户是否实际启用了云同步。我提交了几个类似的功能请求,,但它们完全被忽略了

  1. 是否有更优雅的解决方案?
  2. 检测唤醒/在线事件的健壮解决方案是什么?

存储API的作者。显然,我没有足够的声望来回复评论。无论如何,同步做它的事情和网络状态/事件肯定不会紧密耦合。即使计算机离线,同步也会"完成",但如果计算机在线,则同步可能不会立即"完成"。

像chrome.storage这样的事件。在某种形式下,on稳定化是一个中等频率的请求。不过,除了存储API之外,还有一些复杂的问题。声称同步作为某种推断计算机之间屏障的方式已经加载,这将是一个误导性的API。同步服务器不一定是这样连接的。

。即使用户已经在计算机A上读了一些东西,你更新存储,用户打开计算机B,同步说它已加载…这并不一定保证计算机A的更改已经完全提交并推送给客户端。

因此,我们通常建议容忍这种不确定性。就像您所做的那样,在大胆地推断系统状态之前,请稍作宽宏大量。也许可以使用导航器。在线作为一个粗略的度量。