Firefox browser.tabs.query({}).then() 未定义

Firefox browser.tabs.query({}).then() is undefined

提问人:hansolo 提问时间:4/20/2020 最后编辑:hansolo 更新时间:4/20/2020 访问量:1290

问:

当我这样做时,或者在我的插件的后台脚本中,Firefox抱怨说browser.tabs.query({"currentWindow": true, "active": true}).then(onCall, onError);let querying = browser.tabs.query({"currentWindow": true, "active": true}); querying.then(onCall, onError);

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

当我用以下内容替换同一行时,它将按预期工作,尽管 Firefox API 文档中没有提到这一点:

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

我的Firefox版本在Ubuntu上是75.0(64位)。

这是一个错误,还是我做错了什么?

javascript firefox-插件

评论

1赞 Giorgia Sambrotta 8/4/2021
我有同样的问题。当我使用 browser.cookies.getAll() 时也是如此。对我来说,只有当我使用匿名 func 作为 sec arg 时,它们才有效。但我的感觉是代码的构造方式是真正的问题......即便如此,我还是试图调用或从字面上复制Mozilla示例 developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/...但在任何情况下都没有运气。await browser.tabs.query({"currentWindow": true, "active": true})browser.tabs.query({"currentWindow": true, "active": true}).then()

答:

4赞 Piro 4/20/2020 #1

(以及命名空间下的大多数 API)返回一个 promise。您需要使用或从 promise 中提取“已解析”值。例如:browser.tabs.query()browserawaitPromise.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);
  }
})();

请注意,您需要对每个对象执行此操作,例如,当您想要将 API 的结果用作下一个 API 调用的参数时。Promise

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

仅供参考,还有更多关于异步函数的细节:Promise

基于回调的样式仅在命名空间下可用 - 它通常与 Google Chrome 的 API 兼容。chrome

评论

0赞 hansolo 4/20/2020
实际上,基于回调的风格在Firefox中有效,但该方法不起作用。返回的 promise 为“undefined”。我第一次尝试的东西看起来和你的第一个建议完全一样,只是附加了一个catch()。catch 会改变这里吗?否则,这并不能解决我的问题。.then()
0赞 Piro 4/20/2020
嗯,您是否在插件上使用任何像 github.com/mozilla/webextension-polyfill 这样的 polyfill 库?Firefox必须始终返回一个承诺...browser.tabs.query()