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