Как сделать запрос к chrome.storage не асинхронно?

Инквизитор

Пишу расширение для Хрома. На странице Options сохраняю некоторые параметры с помощью chrome.storage.sync.set:

chrome.storage.sync.set({
  x: document.getElementById('a').value,
  y: document.getElementById('b').value,
  z: document.getElementById('c').value
}, function() {...});

Дальше в Content script'е хочу выполнить нужное мне в зависимости от значения этих параметров. Сперва при загрузке нужной страницы достаю эти данные и присваиваю их значения некоторым переменным:

var baseA = "";
var baseB = "";
var baseC = "";

chrome.storage.sync.get({
    x: "",
    y: "",
    z: ""
}, function(items) {
    setValues(items.x, items.y, items.z);
});

function setValues(v1,v2,v3) {
    baseA = v1;
    baseB = v2;
    baseC = v3;
    console.log('baseA | ' + baseA);
    console.log('baseB | ' + baseB);
    console.log('baseC | ' + baseC);
}

Потом пытаюсь выполнить требуемое:

function doSomething() {
    if (baseA !="") {
        console.log('true ' + baseA);
    }
    else {console.log('false')}
}

doSomething();

Лезу в Options.html, задаю параметры:

x = "aaa";
y = "bbb";
z = "ccc";

Лезу на страницу, где должен отработать контент скрипт и получаю в консоли вот такой результат:

false
baseA | aaa
baseB | bbb
baseC | ccc

То есть, функция doSomething() срабатывает раньше. Вызывать doSomething() через setTimeout неинтересно, поскольку контент скрипт выполняется после загрузки документа, а сколько она займет времени, неизвестно. Я так понимаю, это все из-за того, что doSomething() и chrome.storage.sync.get выполняются асинхронно. А что делать, чтобы гарантированно получить значения параметров до того, как мне они потребуются?

1 ответ

Инквизитор

Нет способа работать с chrome.storage синхронно. Однако вы можете подписаться на событие изменения storage: chrome.storage.onChanges.

И еще: убедитесь что вы используете chrome.storage.sync верно, назначением которого является перенос настроек расширения между компьютерами пользователя (через сервера Google). В случае, если вам требуется хранить настройки расширения локально: лучше воспользоваться chrome.storage.local, который, к тому же, работает немного быстрее.

licensed under cc by-sa 3.0 with attribution.