我遇到了一个容易出问题的困难时期。我正在编写一个chrome扩展,它使用数组来存储用户的单词列表。在启动时,我检查已经过了多长时间,以便我可以向数组添加适当数量的单词。我按照这里的代码How to Push Values To Chrome Storage进行了跟踪:
function addToWords(url) {
chrome.storage.local.get(function(cfg) {
if(typeof(cfg["myWords"]) !== 'undefined' && cfg["myWords"] instanceof Array) {
cfg["myWords"].push(url);
}
chrome.storage.local.set(cfg);
});
}
但无论我做什么以及我多少次调用此函数,我只得到添加到数组中的函数的最后一次调用。例如,如果这是我的“myWords”数组开始:
["dog"]
然后我打电话给
addToWords("horse");
addToWords("bird");
addToWords("pig");
addToWords("cat");
我将留下一个包含两个项目的数组,[“dog”,“cat”]。我没看到的代码有什么问题吗?谢谢
编辑:对于在设置异步回调方法后遇到同样问题的任何人,请注意storage.local和storage.sync !!异步无法正常工作,因为我在控制台中设置本地并检查同步(这就是新值不存在的原因)。感谢大家的帮助。异步建议和使用相同的存储使它运行完美!
答案 0 :(得分:4)
Aren你错过了你想要的keys
项目吗?
StorageArea.get(string or array of string or object keys, function callback)
你总是得到undefined
,因为你错过了钥匙:
chrome.storage.local.get('someKeyRelatedToMyValues', function(cfg){...})
chrome.storage.local.set({'someKeyRelatedToMyValues':cfg})
您还应该考虑对set
方法使用回调函数。如果您需要在存储数据后执行代码并且该代码依赖于存储的数据,则需要等到数据正确存储。
当您连续调用四个addToWords
时,他们不会等待设置数据。所以你可能还需要添加一个回调函数:
function addToWords(url, callback) {
chrome.storage.local.get(function(cfg) {
if(typeof(cfg["myWords"]) !== 'undefined' && cfg["myWords"] instanceof Array) {
cfg["myWords"].push(url);
}
chrome.storage.local.set(cfg, callback);
});
}
addToWords("horse", function(){
addToWords("bird", function(){
addToWords("pig", function(){
addToWords("cat", function(){
//continue your code here
});
});
});
});
看着......我肯定会采用一种存储数组的方法,而不是存储单个值。