【问题标题】:Chrome extension: wait for storage.sync to get remote dataChrome 扩展:等待 storage.sync 获取远程数据
【发布时间】:2014-07-23 16:52:50
【问题描述】:

我有一个扩展程序,可以读取带有时间戳的消息并提醒用户注意它们。

我跟踪用户打开消息以来的最高时间戳,低于该时间戳的任何内容都被“读取”。它运行良好,但当用户安装了多个 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 不提供任何状态信息或事件,即使用户是否实际启用了云同步也不提供。我为此提交了几个featurerequests但它们被完全忽略了

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

【问题讨论】:

  • 我认为目前最好的解决方案是将时间戳存储在远程服务器上,并将用户ID存储在同步存储区。 (PS。我已经对你的错误报告进行了分类,如果你觉得你的票没有得到应有的关注,请在下次给我发邮件。)
  • @RobW 非常感谢;我什至在 chromium-extensions list as suggested by documentation 上发布了请求,但那里也没有引起注意。
  • 我昨天在另一个问题上回答了睡眠检测部分:stackoverflow.com/questions/23933868/…
  • @ZigMandel 我确实想到了这个解决方案。不过它没有发现连接问题,我将尝试document.ononline 事件
  • Chrome 在上线/下线时有通知我也在我的扩展程序上使用它

标签: javascript google-chrome-extension


【解决方案1】:

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

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

例如即使用户在计算机 A 上阅读了某些内容,您更新存储,用户打开计算机 B,同步说它已加载......这并不一定保证来自计算机 A 的更改已完全提交并推送到客户端。

因此,我们通常建议是容忍这种不确定性。就像你所做的那样,在积极地推断系统状态之前给一点优雅。也许确实使用 navigator.onLine 作为粗略的指标。

【讨论】:

  • 1) 现在你有足够的代表了; 2)是否可以向服务器公开上次同步的时间戳?这将解决我的问题
猜你喜欢
  • 1970-01-01
  • 2020-08-03
  • 2012-05-15
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
相关资源
最近更新 更多