javascript - 带有异步等待的 chrome.runtime.onMessage 响应

标签 javascript google-chrome-extension async-await

我想在 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/

相关文章:

javascript - 简化 promise

javascript - Chrome 扩展 - 当 url 更改时附加到页面

c++ - 在多个时间戳执行函数

linq - 如何等待 Linq 查询中的方法

javascript - 如何用数组构成的 ul 列表替换 DOM 元素?

javascript - filepicker.io 小部件在 chrome 和 IE 上不可见

google-chrome-extension - 代码仅在我放置断点时有效

javascript - 内容脚本 CSS 不会覆盖原始内容

c# - 以异步方式调用同步方法?

javascript - 如何在 jquery 中获取 XMLHttpRequest 对象,以便稍后用于另一个请求?