我正在尝试编写一个Firefox网页扩展程序。我想要一个返回选项卡URL的函数。
Firefox选项卡
计划将上述两个调用包装在一个Promise中,该Promise解析为tab.url。使用async/await等待其解析并返回结果。
根据MDN文档:
因此,我的代码如下:
如上所示,控制台的console.dir和console.log语句已经被注释掉了。我调试代码并使用命令行执行测试函数。我错误地认为测试函数中的await应该等待promise解析,然后让我返回值(实际上不是这样的)。
好的,如果我取消注释console.log和console.dir语句,则从命令行运行测试会得到预期的(url)结果。在控制台中,我可以看到log/dir语句的结果,并且当从命令行运行时,最终结果是选项卡的URL(您可以从test2的控制台.dir中获取tab.id)。
如果我注释掉console.dir语句,则日志中会出现一行显示“Promise { : "pending" }”,紧随其后的是新行的期望结果(url)。
如果我然后再注释掉console.log语句,则我只会得到“Promise { : "pending" }”这一行,永远不会得到期望的URL。
如果有人想尝试,请参考下面的清单文件:
Firefox选项卡
browser.tabs.get(id)
返回一个Promise,它解析为一个带有URL成员的选项卡对象。 browser.tabs.query
返回一个Promise,它解析为一个包含选项卡id的选项卡数组。计划将上述两个调用包装在一个Promise中,该Promise解析为tab.url。使用async/await等待其解析并返回结果。
根据MDN文档:
清单文件具有选项卡权限。"await表达式会导致异步函数执行暂停,直到Promise被履行(即被解析或拒绝),并在履行后恢复异步函数的执行。恢复时,await表达式的值为已履行Promise的值。"
因此,我的代码如下:
browser.browserAction.onClicked.addListener(test);
async function test(){
let res = await GetActiveTabURL();
//console.log(`test ${res}`);
return res;
}
async function test2(TabID){
let res = await GetTabURL(TabID);
//console.log(`test2 ${res}`);
return res;
}
function GetActiveTabURL() {
return new Promise((resolve, reject) => {
browser.tabs.query({currentWindow: true, active: true})
.then((tabs) => {
browser.tabs.get(tabs.pop().id)
.then((tab) => {
//console.dir(tab);
resolve(tab.url)
})
})
})
}
function GetTabURL(TabID) {
return new Promise((resolve, reject) => {
browser.tabs.get(TabID)
.then((tab) => {
//console.dir(tab);
resolve(tab.url)
})
})
}
如上所示,控制台的console.dir和console.log语句已经被注释掉了。我调试代码并使用命令行执行测试函数。我错误地认为测试函数中的await应该等待promise解析,然后让我返回值(实际上不是这样的)。
好的,如果我取消注释console.log和console.dir语句,则从命令行运行测试会得到预期的(url)结果。在控制台中,我可以看到log/dir语句的结果,并且当从命令行运行时,最终结果是选项卡的URL(您可以从test2的控制台.dir中获取tab.id)。
如果我注释掉console.dir语句,则日志中会出现一行显示“Promise { : "pending" }”,紧随其后的是新行的期望结果(url)。
如果我然后再注释掉console.log语句,则我只会得到“Promise { : "pending" }”这一行,永远不会得到期望的URL。
如果有人想尝试,请参考下面的清单文件:
{
"manifest_version": 2,
"name": "TestGetURL",
"description": "Functions returning the url",
"version": "1.0",
"icons": {
"48": "icons/link-48.png"
},
"permissions": [
"tabs",
"contextMenus",
"nativeMessaging",
"<all_urls>",
"webRequest",
"downloads",
"clipboardWrite",
"webNavigation",
"notifications",
"storage",
"cookies",
"alarms"
],
"background": {
"scripts": ["background-script.js"]
},
"browser_action": {
"browser_style":false,
"default_icon": {
"16": "icons/page-16.png",
"32": "icons/page-32.png"
}
},
"default_locale": "en"
}
Promise
构造函数反模式! - Bergibrowser.tabs.get
。 - Jaromanda X