如何使用Chrome.storage API等待javascript函数返回响应?

QFD*_*Dev 9 javascript jquery google-chrome google-chrome-extension

我正在尝试使用以下代码在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)
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我按如下方式调用它们:

Chrome_setValue("City", "London");

var keyValue = Chrome_getValue("City");
Run Code Online (Sandbox Code Playgroud)

问题是keyValue总是"未定义",即使我在尝试回读该值时放置了1秒的延迟.我理解这是因为'chrome.storage.local.get'函数是异步的..以下代码工作正常.

Chrome_setValue("City", "London");

chrome.storage.local.get("City", function (result) {
     alert(result["City"]);
});
Run Code Online (Sandbox Code Playgroud)

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

在我使用localStorage之前,这非常简单.

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

//Get
var keyValue = localStorage["City"];
Run Code Online (Sandbox Code Playgroud)

Bee*_*oot 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • chrome.storage.onChanged....。应该是吗chrome.storage.local.onChanged....
  • .removeListener()。如果存在的话,它应该存在addListener,这似乎是合理的,尽管我找不到任何证据。