我将我的Firefox扩展程序移植到Chrome,并且缺少同步首选项服务让生活充满乐趣。
我的用户有一个选项页面,我在这里使用这个方法:https://developer.chrome.com/extensions/options。我将运行内容脚本以从页面获取数据并使用sendMessage将回调发送/接收到后台脚本。
内容脚本需要访问我的扩展选项。它需要这些才能进行处理。当然,Storage API是异步的。我曾尝试过使用Stratify.js来强制Storage API同步运行,但这很丑陋。
这让我写下这样的代码:
chrome.storage.sync.get(defaultPrefs, function(myPrefs) {
//Do all my webpage processing here,
//basically writing my entire Extension inside
// this call to chrome.storage.sync.get()
}
我之前已经通过一些解决方案看过这个问题,但是他们大多使用localStorage,因为我想从这里使用我的偏好,所以它不会工作。
这只是感觉不对,但如果我要使用Storage Sync API作为我的扩展偏好设置,那么我有点卡住了。我使用过的localStorage解决方案主要涉及对sendMessage的调用,让我陷入同样的回调模式。我错过了什么?
答案 0 :(得分:0)
你没有遗漏任何东西。 Google API遵循Javascript理念,是回调驱动的。你应该接受它成为一个优秀的JavaScript开发者。
同步存储的异步模式的一个原因是网络的延迟以及从同步存储发送/接收数据的可能很长时间。 Javascript VM是单线程的,因此如果对存储的调用是同步的并且需要一些时间,则用户界面将冻结等待响应。这对于用户体验是不可接受的。避免此行为的唯一方法是使用回调。在请求完成时,您将提供要执行的功能。
这不是有史以来做得更好的模式,但它确实起到了作用。但它有一个限制:回调地狱。您可以尝试使用Promises管理它,并定义只执行一个原子操作的简单和简短函数。采用函数式编程方法可以帮助实现这一目标。
避免它的另一种方法是创建一个自动与存储同步的对象。它允许您完全同步使用它,但处理可能的错误更加困难。我做了一个here。它缺乏错误处理,并且可以在很大程度上得到改进,但你可以得到这个想法。
我会稍后尝试改进,但我没时间......