Chrome扩展程序:等待storage.sync获取远程数据

Xan*_*Xan 5 javascript google-chrome-extension

我有一个扩展程序,它读取带时间戳的消息的提要并向用户发出警报.

我跟踪用户打开邮件后的最高时间戳,低于"读取"的任何内容.它运行良好,但是当用户安装了多个Chrome时会出现问题:他会看到他已经在另一台计算机上阅读过的项目.

输入chrome.storage.syncAPI.我可以设置最高时间戳以在实例之间进行同步,但这会让我遇到竞争条件.

如果我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();
});
Run Code Online (Sandbox Code Playgroud)

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

  1. 有更优雅的解决方案吗?
  2. 什么是检测唤醒/获取在线事件的强大解决方案?

小智 9

这里是Storage API的作者.我没有足够的声誉来回复评论主题.无论如何,同步做它的事情和网络状态/事件肯定不会紧密耦合.同步将"完成",即使计算机处于脱机状态,但如果计算机联机状态,则同步将可能不被"汉化"马上.

像某种形式的chrome.storage.onStabilized这样的事件是一种适度频繁的请求.但是,Storage API之外还有其他复杂功能.声称同步已被加载为某种推断计算机之间障碍的方式,这将是一种误导性的API.同步服务器不一定以这种方式连线.

例如,即使用户在计算机A上读取了某些内容,您也更新了存储空间,用户打开了计算机B,同步表示已加载...这并不一定能保证计算机A的更改已完全提交并推送给客户端.

因此,我们通常建议的是容忍这种不确定性.就像你已经完成的那样,在积极推断系统状态之前给予一点恩惠.也许使用navigator.onLine作为粗略度量.