在页面中注入异步函数



我正在开发一个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

最新更新