我正在开发一个chrome扩展,我试图在页面中注入一个函数。注入一个常规函数没有问题。
但是一旦我尝试注入任何async函数,我得到一个类似这样的错误:
Uncaught ReferenceError: g is not defined
例如,直接注入async函数
chrome.scripting.executeScript({
target: { tabId: tab.id },
func: async () => {
console.log("Does it work?");
}
});
或者即使我注入了一个普通函数,但是里面有一个async函数:
chrome.scripting.executeScript({
target: { tabId: tab.id },
func: () => {
(async function () {
console.log("Does it work?");
})();
}
});
它不可能是正确的,我被迫编写和注入同步代码,使我无法使用异步/等待功能…可以吗?我做错了什么?
编辑 : ---------------
经过进一步的研究,我可以看到这个函数
async () => { console.log("Does it work?"); };
翻译成这个
function(){return e.apply(this,arguments)}
这解释了ReferenceError
,但仍然让我不知道为什么会发生这种情况。
EDIT2 : ---------------
所以我尝试使用"synchronous"现在代码。但希望我至少可以使用承诺没有async/await -但也没有…
chrome.storage.local.set({ someArray: [] })
.then(() => console.log("It worked?"));
上面的代码导致以下错误:
无法读取未定义的属性(读取'then')
所以没有承诺,没有async/await任何注入的代码…这是真的吗?
注入异步函数应该不会引起问题。我在下面包含了一个最小的示例来演示。
manifest.json
{
"name": "TEST",
"version": "0.0.1",
"manifest_version": 3,
"permissions": [
"scripting",
"activeTab"
],
"host_permissions": [
"<all_urls>"
],
"background": {
"service_worker": "background.js"
}
}
background.js
function inject(tab) {
chrome.scripting.executeScript({
target: {tabId: tab.id},
func: async () => {
window.alert("I'm here!");
}
})
}
// first open tab with some web page -> try inject there
chrome.tabs.query({
url: "https://*/*"
}, function (tabs) {
inject(tabs.shift())
});
关于OP和每个编辑:
Uncaught ReferenceError: g is not defined
-标识符g
不存在:检查它是什么,它应该在哪里定义EDIT 1:如果使用编译器/捆绑器,重命名可能是引用错误的来源
EDIT 2:
chrome.storage.local.set
文档的使用表明它需要一个回调。没有返回值,即未定义,不能在它之后链接then
。