我想在 onMessage 监听器中使用异步等待:
chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) =>{
var key = await getKey();
sendResponse(key);
});
但是,当我发送消息时,我得到了 undefined。
来自 chrome.runtime.onMessage.addListener 的文档:
This function becomes invalid when the event listener returns, unless you return true from the event listener to indicate you wish to send a response asynchronously (this will keep the message channel open to the other end until sendResponse is called).
这在我使用回调时有效。
chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) =>{
getKey(key => {
sendResponse(key);
});
return true;
});
但是我想利用 await 语法。但它似乎不起作用,仍然返回未定义:
chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) =>{
var key = await getKey();
sendResponse(key);
return true;
});
最佳答案
选项 #1 - 最简单
提取到异步函数。
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
doSomethingWith(request).then(sendResponse);
return true; // return true to indicate you want to send a response asynchronously
});
async function doSomethingWith(request) {
var key = await getKey();
// await .....
return key;
}
async
函数的返回值隐式包装在 Promise.resolve
中。参见 async doc .
return true;
语句起到了作用。它告诉 Chrome 您想要异步发送响应。
参见 onMessage .
选项 #2 - 实用程序
如果您觉得您会最频繁地使用它,请创建一个实用程序,例如:
const wrapAsyncFunction = (listener) => (request, sender, sendResponse) => {
// the listener(...) might return a non-promise result (not an async function), so we wrap it with Promise.resolve()
Promise.resolve(listener(request, sender)).then(sendResponse);
return true; // return true to indicate you want to send a response asynchronously
};
chrome.runtime.onMessage.addListener(
wrapAsyncFunction(async (request, sender) => {
console.log(request, sender);
const key = await getKey();
// await .....
return key;
})
);
选项 #3 - 更通用
使用mozilla/webextension-polyfill 如果您更喜欢“跨浏览器”扩展。
例子:
var browser = require("webextension-polyfill");
browser.runtime.onMessage.addListener(async (msg, sender) => {
console.log("BG page received message", msg, "from", sender);
console.log("Stored data", await browser.storage.local.get());
});
browser.browserAction.onClicked.addListener(() => {
browser.tabs.executeScript({file: "content.js"});
});
关于javascript - 带有异步等待的 chrome.runtime.onMessage 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44056271/