从常规函数/方法获取异步API调用的结果

时间:2018-01-16 16:05:00

标签: javascript asynchronous firefox-webextensions webextension-storage

使用我最新的Firefox Webextension要求我调用异步API函数(browser.storage.local.get())。

但是,这意味着API调用的结果不容易从getter获得。并非没有使用" await"反正在异步函数中的关键字。

有没有办法抽象出来,所以可以从任何函数中定期使用getter?

这是(相当早)的代码库。

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();

有问题的部分是内部的阻止"获取ButtonState()"。

假设我想记录Button的当前状态,因为它已保存在存储对象中。

就目前而言,我必须使用" console.log(等待this.ButtonState)",它只能在异步函数中使用。理想情况下,我能够键入" console.log(this.ButtonState)"并从任何地方访问结果。

0 个答案:

没有答案