Получить результат асинхронного вызова API из обычной функции / метода

Работа над моим последним Firefox Webextension требует, чтобы я вызвал функцию асинхронного API (browser.storage.local.get()).

Это, однако, означает, что результат вызова API не легко получить от получателя. В любом случае, без использования ключевого слова "await" внутри асинхронной функции.

Есть ли способ абстрагировать это, чтобы геттер можно было регулярно использовать из любой функции?

Вот (довольно ранняя) кодовая база.

class CookieButton {

async getStorageAsync() {
  var storage = await browser.storage.local.get();
  return storage
}

get ButtonState() {
  console.log("GET")
  return this.getStorageAsync().then(x => x.buttonState)
}

set ButtonState(value) {
  console.log("SET")
  return browser.storage.local.set({ buttonState: value })
}

constructor(ButtonState) {
  this.setup()
}

async enable() {
  browser.privacy.websites.cookieConfig.set({ value: { behavior: "allow_all" } })
  this.ButtonState = 'turn-off';
  browser.browserAction.setIcon({ path: 'icons/enabled.png', });
}

async disable() {
  browser.privacy.websites.cookieConfig.set({ value: { behavior: "reject_all" } })
  this.ButtonState = 'turn-on';
  browser.browserAction.setIcon({ path: 'icons/disabled.png', });
}

async setup() {
  if (await this.ButtonState == undefined) {
    this.ButtonState = "turn-off";
  }
  if (await this.ButtonState == "turn-on") {
    browser.browserAction.setIcon({ path: 'icons/disabled.png', });
  }
  browser.browserAction.onClicked.addListener(async function (tab) {
    var state = await cookieButton.ButtonState;
    switch (state) {
      case 'turn-on':
        cookieButton.enable();
        break;
      case 'turn-off':
        cookieButton.disable();
        break;
      case 'undefined':
        cookieButton.enable();
        break;
    }
  });
 }
}

var cookieButton = new CookieButton();

Речь идет о блоке внутри "get ButtonState()".

Скажем, я хотел записать текущее состояние кнопки, так как она сохраняется внутри объекта хранения.

В его нынешнем виде я должен использовать "console.log(await this.ButtonState)", который будет работать только внутри асинхронной функции. В идеале я мог бы набрать "console.log(this.ButtonState)" и получить доступ к результату из любого места.

0 ответов

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