提问人:hansolo 提问时间:4/20/2020 最后编辑:hansolo 更新时间:4/20/2020 访问量:1290
Firefox browser.tabs.query({}).then() 未定义
Firefox browser.tabs.query({}).then() is undefined
问:
当我这样做时,或者在我的插件的后台脚本中,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位)。
这是一个错误,还是我做错了什么?
答:
4赞
Piro
4/20/2020
#1
(以及命名空间下的大多数 API)返回一个 promise。您需要使用或从 promise 中提取“已解析”值。例如:browser.tabs.query()
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);
}
})();
请注意,您需要对每个对象执行此操作,例如,当您想要将 API 的结果用作下一个 API 调用的参数时。Promise
(async () => {
const tabs = await browser.tabs.query({"currentWindow": true, "active": true});
const tab = await browser.tabs.query(tabs[0].id);
})();
仅供参考,还有更多关于异步函数的细节:Promise
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
基于回调的样式仅在命名空间下可用 - 它通常与 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()
评论
await browser.tabs.query({"currentWindow": true, "active": true})
browser.tabs.query({"currentWindow": true, "active": true}).then()