我有一个从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);
});
}
任何帮助都将不胜感激,谢谢。
答案 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.sync
或storage.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") {
。