检查chrome.storage.sync中是否已存在数据

时间:2015-04-01 19:34:56

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

我有一个从chrome.storage获取数据并将其加载到数组中的函数,如果我使用一行代码将空数组保存到chrome.storage中,然后在将扩展名用作用户之前将其取出,则一切正常会。

问题是用户无法做到这一点,如果我第一次启动扩展而不执行此操作,那么看起来chrome会将未定义的内容传递回变量,从而导致此错误:

  

“未捕获的TypeError:无法读取未定义的属性'8'”

在这一行:

if (SavedReminders[i][8] == "Full") {

我不完全确定到底发生了什么,但我想如果有办法检查数据是否已存在于chrome.storage中,或者只是在用户第一次打开时保存空数组的方式可以解决它的扩展。

这是我的加载功能:

function LoadFromFile() {
    reminds = {}
    chrome.storage.sync.get({ reminds: [] }, function (result) { SavedReminders = result.reminds });
}

并保存功能:

function SaveToFile() {
    reminds={}
    chrome.storage.sync.set({reminds:SavedReminders }, 
        function () {
            console.log(SavedReminders, reminds);
        });
}

任何帮助都将不胜感激,谢谢。

3 个答案:

答案 0 :(得分:1)

您可以使用每个键的默认值将对象传递给api(而不是键数组)。它将返回不存在的键的默认值 你也可以保持原样并检查它是否= = undefined但我建议的方式更清晰 有关如何传递此类对象的详细信息,请参阅.storage的官方api文档:

https://developer.chrome.com/extensions/storage StorageArea方法:get StorageArea.get(string or array of string or object keys, function callback) (可选)键: ...“或指定默认值的字典”......

所以 chrome.storage.local.get({foo:"hi", bar:"there"}) 当尚未保存时,obj [“foo”]为“hi”将返回obj。

答案 1 :(得分:1)

在我的情况下,我正在寻找一个字典,并且调用似乎与字典一起返回某种原型对象(因此对象类型不是“未定义”)。为了获得我实际需要的值,我必须检查返回对象的属性。

chrome.storage.sync.get('profile', function(profileObj) {
  var profile = profileObj.profile;
  if (typeof profile === "undefined") {
    // No profile in storage
  } else {
    // Profile exists in storage
  }
});

答案 2 :(得分:0)

您还可以使用空对象检测来检查storage.syncstorage.local是否返回未初始化的存储:

function _empty(o) {
    return Object.keys(o).length === 0 && o.constructor === Object
}

因此,if (SavedReminders[i][8] == "Full") {行将成为if(!_empty(SavedReminders))if (SavedReminders && SavedReminders[i] && SavedReminders[i][8] == "Full") {