【问题标题】:Chrome Extension Options from a content script内容脚本中的 Chrome 扩展选项
【发布时间】:2015-12-30 23:59:35
【问题描述】:

我正在将我的 Firefox 扩展程序移植到 Chrome,并且缺少同步首选项服务让生活变得有趣。

我有一个供我的用户使用的选项页面,我正在使用这里的方法:https://developer.chrome.com/extensions/options。我将运行内容脚本以从页面获取数据并使用 sendMessage 向后台脚本发送/接收回调。

内容脚本需要访问我的扩展选项。它在处理之前需要这些。当然,存储 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,因为我想从这里使用我的偏好,所以这不起作用。

这感觉不对,但如果我打算将存储同步 API 用于我的扩展首选项,那么我有点卡住了。我使用的 localStorage 解决方案主要涉及对 sendMessage 的调用,这让我陷入了同样的回调模式。我错过了什么?

【问题讨论】:

  • 那么,异步有什么问题呢?

标签: javascript asynchronous google-chrome-extension


【解决方案1】:

你没有错过任何东西。 Google API 是回调驱动的,因为它遵循 Javascript 哲学。你应该接受它成为一个优秀的 javascript 开发者。

同步存储采用异步模式的一个原因是网络延迟以及从同步存储发送/接收数据的时间可能很长。 Javascript VM 是单线程的,因此如果对存储的调用是同步的并且需要一些时间,用户界面将冻结等待响应。这对于用户体验来说是不可接受的。避免这种行为的唯一方法是使用回调。当请求完成时,你给出你想要执行的函数。

这不是有史以来更好的模式,但它确实有效。但它有一个限制:回调地狱。您可以尝试使用 Promises 管理它并定义仅执行一个原子操作的简单而简短的函数。采用函数式编程方法可以帮助做到这一点。

另一种避免这种情况的方法是创建一个自动与存储同步的对象。它允许您完全同步地使用它,但处理可能的错误更加困难。我做了一个here。它缺乏错误处理,可以在很大程度上改进,但你可以理解。

我稍后会尝试改进,但我没有时间......

【讨论】:

  • 谢谢:)。困扰我的并不是真正的回调地狱。在这种情况下,我的代码并不复杂。只是我的主程序逻辑将由存在的回调驱动,以获取一些设置。这似乎无论哪种方式都会表现得很糟糕,并且会破坏异步回调的目的。
  • 是的,我也有同样的感觉 :-) 这就是我制作这个小物件的原因。用起来真的很爽
猜你喜欢
  • 1970-01-01
  • 2016-02-24
  • 2021-06-15
  • 2012-07-08
  • 2011-09-28
  • 2013-12-26
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多