我有一个用户脚本,我已经为使用Chrome的用户转换为Chrome扩展程序。用户脚本设置主题并具有可供选择的主题,但仅使用localStorage,除主子域之外的任何内容都将具有默认主题。我希望使用Chrome的存储API可以缓解这种情况,但我对如何使其工作感到难过。
这是原始代码:
hasGM: typeof GM_deleteValue !== "undefined",
get: function(name)
{
var val = this.hasGM ?
GM_getValue(NAMESPACE + name) :
localStorage.getItem(NAMESPACE + name);
if (val != undefined)
return JSON.parse(val);
return defaultConfig[name];
},
set: function(name, val)
{
name = NAMESPACE + name;
if (typeof val !== "number")
val = JSON.stringify(val);
return this.hasGM ?
GM_setValue(name, val) :
localStorage.removeItem(name, val),
localStorage.setItem(name, val);
}
},
这就是我到目前为止所处的内容,即使我可以在控制台中完美地执行一个console.log结果[NAMESPACE + name]和值,也将val打印为undefined。
hasGM: typeof GM_deleteValue !== "undefined",
get: function(name)
{
names = NAMESPACE + name;
var val = this.hasGM ?
GM_getValue(names) :
chrome.storage.local.get(names, function(result){return result[NAMESPACE + name];});
if (val != undefined)
return JSON.parse(val);
console.log(val);
return defaultConfig[name];
},
set: function(name, val)
{
name = NAMESPACE + name;
setObj={};
setObj[name]=val;
if (typeof val !== "number" && this.hasGM)
val = JSON.stringify(val);
return this.hasGM ?
GM_setValue(name, val) :
chrome.storage.local.remove(name),
chrome.storage.local.set(setObj);
}
基本上我无法绕过它并需要一些帮助
for (var key in defaultConfig)
$SS.conf[key] = parseVal(key, this.get(key, function(_arg) {
var val;
val = _arg[key];
return callback(val);
}));
答案 0 :(得分:3)
这是你可以做的事情,我省略了hasGM
的东西以简化事情:
get: function(name, callback) {
names = NAMESPACE + name;
chrome.storage.local.get(names, function(val){
if (val != undefined) {
callback(JSON.parse(val));
} else {
callback(defaultConfig[name]);
}
})
},
所以这意味着调用你的get
函数的代码也必须改变,对不起,但实际上没有其他办法。您可以(并且大多数人会)将您的同步内容转换为使用回调模式,例如:
get: function(name, callback) {
names = NAMESPACE + name;
if(this.hasGM) {
callback(GM_getValue(names));
} else {
chrome.storage.local.get(names, function(val){
if (val != undefined) {
callback(JSON.parse(val));
} else {
callback(defaultConfig[name]);
}
})
}
},
处理异步函数的一些规则: