Firefox browser.tabs.query ({}). Then () не определен - PullRequest
0 голосов
/ 19 апреля 2020

Когда я делаю browser.tabs.query({"currentWindow": true, "active": true}).then(onCall, onError); или let querying = browser.tabs.query({"currentWindow": true, "active": true}); querying.then(onCall, onError); в фоновом скрипте моего аддона Firefox жалуется, что

Unchecked lastError value: Error: browser.tabs.query(...) is undefined

Когда я заменяю ту же строку на следующую, она будет работать как положено, хотя это не упоминается в Firefox API документах :

browser.tabs.query({"currentWindow": true, "active": true}, function(tabs){
        onCall(tabs); 
      });

Моя Firefox версия 75.0 (64-разрядная) в Ubuntu.

Это ошибка или я что-то не так делаю?

1 Ответ

1 голос
/ 20 апреля 2020

browser.tabs.query() (и большинство API в пространстве имен browser) возвращает обещание. Вам нужно использовать await или Promise.prototype.then(), чтобы извлечь "разрешенное" значение из обещания. Например:

browser.tabs.query({"currentWindow": true, "active": true})
  .then(onCall)
  .catch(onError);

Или:

(async () => {
  try {
    const tabs = await browser.tabs.query({"currentWindow": true, "active": true});
    onCall(tabs);
  }
  catch(error) {
    onError(error);
  }
})();

Напоминаем, что вам нужно сделать это для каждого объекта Promise, например, когда вы хотите использовать результат из API в качестве параметра для следующего вызова API.

(async () => {
  const tabs = await browser.tabs.query({"currentWindow": true, "active": true});
  const tab = await browser.tabs.query(tabs[0].id);
})();

К вашему сведению, есть более подробная информация о Promise и функции asyn c:

Стиль, основанный на обратном вызове, доступен только в пространстве имен chrome - обычно он работает совместимо с Google Chrome API.

...