我正在尝试在chrome存储中保存字典对象列表。但是下面的代码似乎没有按预期工作。
当扩展首次加载且存储中没有goal
对象时,应设置runtime.lasterror
对象并执行该部分中的代码。但事实并非如此。
当我取消注释chrome.storage.sync.set
行并保存对象时,下次我调用函数期望它保存列表时,它不会。它没有提供任何警告框。
function isPgUrl(pg_url,gl_name) {
if(pg_url && gl_name) {
dic_url={
"name":gl_name,
"pg_url":pg_url
}
//chrome.storage.sync.set({"goal":[dic_url]});
chrome.storage.sync.get(["goal"], function(data) {
if(chrome.runtime.lastError) {
chrome.storage.sync.set({"goal":[dic_url]},function() {
alert("blah");
});
alert("here");
return;
}
var list=data.goal;
list.append(dic_url);
alert(list);
chrome.storage.sync.set({"goal":list},function() {
alert("lalala");
return;
});
});
}
}
答案 0 :(得分:1)
您永远不会为丢失的数据设置chrome.runtime.lastError
。这不是例外 - 您只获得undefined
价值。所以你的支票应该是:
if(!data.goal) { ... }
或
if(typeof data.goal === "undefined") { ... }
如果取消注释该行,则需要注意chrome.storage
是异步的:在.set()
的回调之前,数据不存储。因此,在调用.get()
后立即执行的.set()
可能会获得存储旧视图的快照 - 使您的代码在list.append(dic_url);
失败
首先不存在Array.prototype.append
。您应该使用.push()
。
通过将对象用作查询,Chrome存储有一种更有效的方法来设置默认(如果不存储)值:
chrome.storage.sync.get({key: "defaultValue"}, function(data) {
// data.key will be the stored value, or "defaultValue" if not in storage
});
因此,如果我正确理解了代码的用途(将dic_url
附加到存储中的goal
),就可以执行此操作:
// Makes more sense to default to empty list
chrome.storage.sync.get({goal: []}, function(data) {
var list = data.goal;
list.push(dic_url);
chrome.storage.sync.set({goal: list}, function() {
// Stoarge updated, dic_url appended to goal
});
// Storage is not yet updated - set() is async
});
// Storage is not yet updated - get()/set() are async