在 Chrome 扩展中向数组添加新元素

Adding New Element to Array in Chrome Extension

我遇到了一个本应很简单的问题。我正在编写一个 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!!异步不起作用,因为我正在设置本地并在控制台中检查同步(这就是为什么没有新值的原因)。感谢大家的帮助。异步建议和使用相同的存储使其 运行 完美!

你没有错过 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
          });
       });
    });
 });

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