Добавление нового элемента в массив в расширении Chrome

У меня самое сложное время с тем, что должно быть легкой проблемой. Я пишу расширение Chrome, которое использует массив для хранения списка слов для пользователя. При запуске я проверяю, сколько времени прошло, чтобы я мог добавить нужное количество слов в массив. Я следовал приведенному здесь коду. Как перенести значения в 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");

Я бы оставил массив с двумя элементами, ["собака","кошка"]. Что-то не так с кодом, которого я не вижу? Спасибо

РЕДАКТИРОВАТЬ: Для тех, у кого есть такая же проблема ПОСЛЕ настройки их методов асинхронного обратного вызова, обратите внимание на storage.local и storage.sync!! Асинхронизация не работала, потому что я настраивал local и проверял синхронизацию в консоли (вот почему новых значений там не было). Спасибо всем за вашу помощь. Асинхронные предложения и использование того же хранилища делают его безупречным!

1 ответ

Решение

Вы не пропустили 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
          });
       });
    });
 });

Глядя на это.... Я бы, конечно, пошел к подходу, который хранит массив вместо хранения одного значения.

Другие вопросы по тегам