在Chrome扩展中向阵列添加新元素

时间:2015-07-07 05:36:32

标签: google-chrome-extension google-chrome-storage

我遇到了一个容易出问题的困难时期。我正在编写一个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 !!异步无法正常工作,因为我在控制台中设置本地并检查同步(这就是新值不存在的原因)。感谢大家的帮助。异步建议和使用相同的存储使它运行完美!

1 个答案:

答案 0 :(得分:4)

Aren你错过了你想要的keys项目吗?

根据documentation

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
          });
       });
    });
 });

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