使用异步等待的chrome.runtime.onMessage响应

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)

  • 美丽的!Sd 是公认的答案。 (2认同)
  • 效果很好。我也最喜欢这个了。 (2认同)

Nin*_*ham 9

我通过提取到异步函数来解决问题.

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.见文档.

  • 谢谢!在我从侦听器中删除异步并按照您的指示操作后,效果很好 (4认同)
  • @AlexSham,它是“doSomethingWith(request).then(result => sendResponse(result));”的简写。 (3认同)
  • @Arst 新文档(MV3)没有提到“return true”,而旧文档却提到了。https://web.archive.org/web/20190330142950/https://developer.chrome.com/apps/runtime#event-onMessage (3认同)

zyf*_*fyy 5

当您有响应时调用的函数(最多一次)。参数应该是任何可 JSON 的对象。如果同一文档中有多个 onMessage 侦听器,则只有一个可以发送响应。当事件监听器返回时,此函数将变得无效,除非您从事件监听器返回 true来指示您希望异步发送响应(这将使消息通道保持对另一端开放,直到调用 sendResponse 为止)。

https://developer.chrome.com/docs/extensions/reference/runtime/#event-onMessage

不得不说官方文档真的很难读。


Blu*_*her 0

老实说,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.