如何通过本地getter setter类获取chrome存储值?

时间:2017-11-05 19:14:08

标签: javascript google-chrome-extension asynccallback google-chrome-storage

我在JavaScript文件中创建了一个本地类,其中包含以下内容:

class CustomChromeStorage {
    //#region userName
    get userName() {

        let isCurrentValueSet = false;
        chrome.storage.sync.get('userName', function (obj) {
            this._userName = obj;
            isCurrentValueSet = true;
        });
        while (true) {
            if (isCurrentValueSet) {
                return this._userName;
            }
        }
    }

    set userName(newValue) {
        this._userName = newValue;
        chrome.storage.sync.set({ 'userName': newValue }, function () {
        });
    }
    remove_userName() {
        this._userName = null;
        chrome.storage.sync.remove('userName', function () {
        });
    }
    //#endregion userName

我想做这种类型的代码就是当我在我的代码中的其他地方写代码时:

alert(new CustomChromeStorage().userName);

然后我的代码只是从chrome存储中提取用户名并通过警报显示它。为了从chrome存储中获取值,我们需要提供一个带有as参数值的回调。我知道这对于异步处理来说是一种很好的做法,但是对于我来说处理所有回调有时会变得很麻烦。

当我通过我的自定义类从chrome存储中获取值以异步执行当前代码时,我希望这样。这就是我在该属性的getter方法中编写无限while循环的原因,但问题是当我尝试通过自定义chrome存储类警告用户名时,我的整个程序执行变为挂起。

背后的原因是我最初设置isCurrentValueSet = false,它在循环中永远不会变为真。

如果有人知道为什么它在循环中没有设置为true那么请告诉我。

1 个答案:

答案 0 :(得分:3)

从sync.get返回的obj是{userName:value} - 使用obj.userName。

原因isCurrentValueSet未设置为true是因为该函数是异步的 - 当回调执行时,它无法访问类变量isCurrentValueSet。

你想要实现的是错误的。事实上,存储请求是异步的,以保证用户和浏览器的性能。你必须学会​​围绕它进行设计,当你习惯它时它很容易。

您可以在一次点击中检索多个变量,因此如果您有一段需要多个变量的代码,请执行以下操作:

chrome.storage.sync.get({a:"",b:"",c:0,d:[]}, function(result) {
  a = result.a
  b = result.b
  c = result.c
  d = result.d
  your code
});

通过传入一个对象,您可以请求多个变量定义默认值(如果它们尚不存在)。当然,你没有来提取变量。