Chr*_*ris 13 javascript google-chrome-extension async-await
我想在onMessage监听器中使用async await:
chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) =>{
var key = await getKey();
sendResponse(key);
});
Run Code Online (Sandbox Code Playgroud)
但是当我发送消息时,我得到了不确定.
从chrome.runtime.onMessage.addListener的文档中:
当事件侦听器返回时,此函数变为无效,除非您从事件侦听器返回true以指示您希望异步发送响应(这将使消息通道保持打开到另一端,直到调用sendResponse).
这在我使用回调时有效.
chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) =>{
getKey(key => {
sendResponse(key);
});
return true;
});
Run Code Online (Sandbox Code Playgroud)
但是我想利用await语法.但它似乎没有工作,仍然返回undefined:
chrome.runtime.onMessage.addListener(async (request, sender, sendResponse) =>{
var key = await getKey();
sendResponse(key);
return true;
});
Run Code Online (Sandbox Code Playgroud)
dag*_*han 10
我能得到的最接近的:
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
(async () => {
var key = await getKey();
sendResponse(key);
})();
return true;
});
Run Code Online (Sandbox Code Playgroud)
我通过提取到异步函数来解决问题.
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
doSomethingWith(request).then(sendResponse);
return true; // return true to indicate you wish to send a response asynchronously
});
async function doSomethingWith(request) {
var key = await getKey();
// await .....
return key;
}
Run Code Online (Sandbox Code Playgroud)
async
函数的返回值隐式包含在中Promise.resolve
.见文档.
当您有响应时调用的函数(最多一次)。参数应该是任何可 JSON 的对象。如果同一文档中有多个 onMessage 侦听器,则只有一个可以发送响应。当事件监听器返回时,此函数将变得无效,除非您从事件监听器返回 true来指示您希望异步发送响应(这将使消息通道保持对另一端开放,直到调用 sendResponse 为止)。
https://developer.chrome.com/docs/extensions/reference/runtime/#event-onMessage
不得不说官方文档真的很难读。
老实说,Google Chrome 扩展似乎不支持该await
关键字。我之前已经成功使用过 asynchronous chrome.runtime.onMessage.addListener
,每次尝试使用时,await
我都会在 Chrome 调试工具中看到以下语法错误await
:
这是我一直在测试的方法:
我创建了一个非常基本的监听器:
chrome.runtime.onMessage.addListener(function(data, MessageSender, sendResponse) {
sendResponse(awaitTester);
var async = true;
// returns true if asyncronous is needed
if (async) return true;
});
Run Code Online (Sandbox Code Playgroud)
我的awaitTester
函数如下所示:
function awaitTester() {
var prom = new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('test');
}, 4000);
});
var awaited = await prom;
return awaited;
}
Run Code Online (Sandbox Code Playgroud)
最后,我的消息发送者就是你所期望的:
chrome.runtime.sendMessage({}, function(message) {
debugger;
console.log(message);
});
Run Code Online (Sandbox Code Playgroud)
在调试器/控制台中我总是得到undefined
.