从chrome.storage.sync保存和检索

p8ekf7hl  于 2023-05-27  发布在  Go
关注(0)|答案(7)|浏览(418)

我试图将数据对象保存在chrome sync存储中,然后检索它,但是get()函数总是返回一个空对象。我使用的代码是

function storeUserPrefs() {
    var key='myKey', testPrefs = {'val': 10};
        chrome.storage.sync.set({key: testPrefs}, function() {console.log('Saved', key, testPrefs);});
}

function getUserPrefs() {
    chrome.storage.sync.get('myKey', function (obj) {
        console.log('myKey', obj);
    });
}

有人能告诉我我做错了什么吗?

b0zn9rqh

b0zn9rqh1#

问题出在chrome.storage.sync.set({key: testPrefs}
您的数据存储为

{
    key: "{"val":10}"
}

因此,您的代码chrome.storage.sync.get('myKey')返回undefined\empty object

方案一

使用字符串"key"作为密钥

chrome.storage.sync.get("key", function (obj) {
    console.log(obj);
});

方案二

通过"myKey"键设置数据。

chrome.storage.sync.set({"myKey": testPrefs})
    • P. S**:不要忘记chrome.storage.sync是永久存储API,在进一步测试之前使用chrome.storage.sync.clear查看变化

参考资料

编辑1

使用此代码在www.example.com中设置变量值Chrome.storage

function storeUserPrefs() {
    var key = "myKey",
        testPrefs = JSON.stringify({
            'val': 10
        });
    var jsonfile = {};
    jsonfile[key] = testPrefs;
    chrome.storage.sync.set(jsonfile, function () {
        console.log('Saved', key, testPrefs);
    });

}

它生成以下输出

Object{
    myKey: "{"val":10}"
}
5gfr0r5j

5gfr0r5j2#

一种更花哨的方法来做这件事,它也处理错误:

const getStorageData = key =>
  new Promise((resolve, reject) =>
    chrome.storage.sync.get(key, result =>
      chrome.runtime.lastError
        ? reject(Error(chrome.runtime.lastError.message))
        : resolve(result)
    )
  )

const { data } = await getStorageData('data')

const setStorageData = data =>
  new Promise((resolve, reject) =>
    chrome.storage.sync.set(data, () =>
      chrome.runtime.lastError
        ? reject(Error(chrome.runtime.lastError.message))
        : resolve()
    )
  )

await setStorageData({ data: [someData] })
7eumitmz

7eumitmz3#

function storeUserPrefs() {
    var key='myKey', testPrefs = {'val': 10};
    chrome.storage.sync.set({[key]: testPrefs}, function() {
      console.log('Saved', key, testPrefs);
    });
}

你可以在保存时使用[key]强制计算变量key。这种方式很容易动态设置关键点。希望能帮上忙。

3yhwsihp

3yhwsihp4#

由于chrome.storage.sync可以存储JS对象,你可以这样做:

var save = {};
save["myKey"] = testPrefs;

chrome.storage.sync.set(save, function() {
    console.log('Settings saved');
});
s2j5cfk0

s2j5cfk05#

testPrefs = JSON.stringify({
            'val': 10
        });
    var jsonfile = {};
    jsonfile[key] = testPrefs;
    chrome.storage.sync.set(jsonfile, function () {
        console.log('Saved', key, testPrefs)
uqdfh47h

uqdfh47h6#

通过使用WebExtension browser API Polyfill,您可以使用promises,也可以使用TS和下面的代码来设置chrome的同步并获得同步

function getStore() {
    return chrome.storage.sync.get("myKey").then(function (value) {
        return value["myKey"];
    });
}

function setStore() {
    return chrome.storage.sync.set("myKey","value").then(function (value) {
        return "Success!";
    });
}
wqnecbli

wqnecbli7#

ECMA现在有了新的语法来简化你的例子

function storeUserPrefs() {
    var key='myKey', testPrefs = {'val': 10};
        chrome.storage.sync.set({key: testPrefs}, function() {console.log('Saved', key, testPrefs);});
}

function getUserPrefs() {
    chrome.storage.sync.get('myKey', function ({myKey}) {
        console.log('myKey', obj);
    });
}

所以现在要摆脱对象名,你只需要析构参数对象,它将解包它。Hennce看看这个语法:

let ob={a:"me",b:"and" ,c:"myself",d:"and", e:"eye", f:"o_O"}

function someFunction( {c,d,f} ){
 console.log( c,d,f)  //output:   myself and o_O
}

相关问题