1

我遇到了最困难的问题,这应该是一个简单的问题。我正在编写一个 chrome 扩展,它使用一个数组来存储用户的单词列表。在启动时,我检查已经过去了多少时间,以便可以将适当数量的单词添加到数组中。我在这里按照代码如何将值推送到 Chrome 存储,如下所示:

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!异步不起作用,因为我在控制台中设置本地并检查同步(这就是新值不存在的原因)。感谢大家的帮助。异步建议和使用相同的存储使其完美运行!

4

1 回答 1

4

你不是错过了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
          });
       });
    });
 });

看着那个......我肯定会采用一种存储数组而不是存储单个值的方法。

于 2015-07-07T11:23:54.180 回答