9

我正在尝试使用以下代码在 Chrome 扩展程序中设置和获取名称值对。

if (!this.Chrome_getValue || (this.Chrome_getValue.toString && this.Chrome_getValue.toString().indexOf("not supported") > -1)) {
    this.Chrome_getValue = function (key, def) {
        chrome.storage.local.get(key, function (result) {
            return result[key];
        });
    };
    this.Chrome_setValue = function (key, value) {
        var obj = {};
        obj[key] = value;
        return chrome.storage.local.set(obj)
    }
}

然后我按如下方式调用这些:

Chrome_setValue("City", "London");

var keyValue = Chrome_getValue("City");

问题是 keyValue 总是“未定义”,即使我在尝试读回值时延迟了 1 秒。我知道这是因为“chrome.storage.local.get”函数是异步的。以下代码可以正常工作。

Chrome_setValue("City", "London");

chrome.storage.local.get("City", function (result) {
     alert(result["City"]);
});

绑定keyValue(使用)时有什么办法get可以强制代码等待函数返回响应?或者也许我从错误的角度来处理这个问题。本质上,我正在寻找一种方法可以抽象出chrome.storage 框架中处理数据的方法setget理想情况下,我可以调用两个简单的函数来设置和检索名称值对。

在我使用非常简单的 localStorage 之前。

//Set
localStorage["City"] = "London";

//Get
var keyValue = localStorage["City"];
4

2 回答 2

4

QF_D,我在这里进行了有根据的猜测,所以要做好第一次不工作的准备.....

..... 开始 :

if (!this.Chrome_getValue || (this.Chrome_getValue.toString && this.Chrome_getValue.toString().indexOf("not supported") > -1)) {
    this.Chrome_getValue = function (key, def) {
        var dfrd = $.Deferred();
        chrome.storage.local.get(key, function (result) {
            dfrd.resolve(result[key]);
        });
        return dfrd.promise();
    };
    this.Chrome_setValue = function (key, value) {
        var dfrd = $.Deferred();
        var obj = {};
        obj[key] = value;
        var listen = function(changes, namespace) {
            dfrd.resolve(changes[key]);
            chrome.storage.onChanged.removeListener(listen);//remove, to prevent accumulation of listeners
        }
        chrome.storage.onChanged.addListener(listen);
        chrome.storage.local.set(obj);
        return dfrd.promise()
    }
}

get 和 set 函数因此应该返回 jQuery 承诺。set 函数返回的 promise 使用此处StorageChange定义的对象解析。一般来说,你不需要这个对象,而只是响应正在解决的承诺。

以上所有内容均未经测试。我不太确定:

  • chrome.storage.onChanged..... 应该是chrome.storage.local.onChanged....吗?
  • .removeListener(). 如果存在,它应该存在似乎是合理的addListener,尽管我找不到任何证据。
于 2013-05-01T12:21:44.767 回答
3

嗯,本质上是因为chrome.storageAPI 是异步的。你正面临着 JavaScript 核心的东西。

chrome.storage.get回调中执行的内容不会chrome.storage.get. 你有两种处理方式:

  • 处理回调中的存储值
  • 使用 Promise 模式让您的代码感觉同步(参见上一个答案)

你真的必须弄清楚同步异步之间的区别。

于 2013-05-01T13:50:16.707 回答