0

Я пытаюсь сохранить список объектов словаря в хром-хранилище. Но следующий код, похоже, не работает должным образом.chrome.storage не работает как ожидалось

Когда расширение загружается в первый раз и нет объекта goal в хранилище, должен быть установлен объект runtime.lasterror, и код в этой части должен быть выполнен. Но это не так.

Когда я раскомментирую строку chrome.storage.sync.set и сохраняю объект, и в следующий раз, когда я вызову функцию, ожидающую сохранения списка, это не так. Он не дает никаких предупреждающих ящиков.

function isPgUrl(pg_url,gl_name) { 
    if(pg_url && gl_name) { 

    dic_url={ 
     "name":gl_name, 
     "pg_url":pg_url 
    } 

    //chrome.storage.sync.set({"goal":[dic_url]}); 

    chrome.storage.sync.get(["goal"], function(data) { 
     if(chrome.runtime.lastError) { 
     chrome.storage.sync.set({"goal":[dic_url]},function() { 
      alert("blah"); 
     }); 
     alert("here"); 
     return; 
     } 
     var list=data.goal; 
     list.append(dic_url); 
     alert(list); 
     chrome.storage.sync.set({"goal":list},function() { 
     alert("lalala"); 
     return; 
     });  
    }); 
    } 
} 

ответ

1
  1. Вы никогда не будете получать chrome.runtime.lastError набор недостающих данных. Это не исключение - вы просто получаете значение undefined. Так что ваш чек должен быть:

    if(!data.goal) { ... } 
    

    или

    if(typeof data.goal === "undefined") { ... } 
    
  2. Если раскомментировать эту строку, вы должны знать, что chrome.storage является асинхронным: данные не являются в хранилище до обратного вызова .set(). Таким образом, ваш .get(), который выполняется сразу после вызова .set() может получить снимок старого зрения хранения - сделать свой код провала в list.append(dic_url);

    Не то, Array.prototype.append существует в первую очередь. Вы должны использовать .push().

  3. Chrome хранения имеет более эффективный способ установки значения по умолчанию, если-не-в-памяти, с помощью объекта в качестве запроса:

    chrome.storage.sync.get({key: "defaultValue"}, function(data) { 
        // data.key will be the stored value, or "defaultValue" if not in storage 
    }); 
    

Так что, если я понимаю, цель вашего кода правильно (добавить dic_url к goal в памяти), то это будет делать:

// Makes more sense to default to empty list 
chrome.storage.sync.get({goal: []}, function(data) { 
    var list = data.goal; 
    list.push(dic_url); 
    chrome.storage.sync.set({goal: list}, function() { 
    // Stoarge updated, dic_url appended to goal 
    }); 
    // Storage is not yet updated - set() is async 
}); 
// Storage is not yet updated - get()/set() are async 
+1

Как и в сторону, не использовать 'сигнал()' для отладки - использовать 'console.log()' и посмотрите [в правильной консоли] (htt р: //stackoverflow.com/q/36107503/934239). – Xan

+0

спасибо за подсказку @Xan. Я пробую код, данный вами. Я позволю тебе знать как можно скорее. –

+0

Знайте, что я сделал опечатку, которую я только что исправил, - не добавлял параметр 'data' для обратного вызова' get() ' – Xan