首页  >  文章  >  web前端  >  如何让'sendResponse”等待 Chrome 扩展中的异步函数?

如何让'sendResponse”等待 Chrome 扩展中的异步函数?

DDD
DDD原创
2024-11-23 20:21:09162浏览

How Can I Make `sendResponse` Wait for Async Functions in Chrome Extensions?

sendResponse 等待异步函数和 Promise 解析

问题: 在 Chrome 扩展程序中,内容脚本中的 sendResponse() .js 不会暂停 getThumbnails()

说明: Chrome 的 chrome.runtime.onMessage 事件监听器返回一个布尔值,以指示通道是否应为 sendResponse 保持打开状态。当返回异步函数或 Promise 时,Chrome 会忽略 Promise 并立即关闭通道。

解决方案:使事件监听器与异步函数兼容:

  1. 删除 async 关键字:从事件监听器的开头删除 async 关键字function.
  2. 定义一个单独的异步函数:创建一个单独的异步函数来处理消息处理。从事件侦听器中调用此函数。

示例:

chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => {
  if (msg.message === "get_thumbnails") {
    processMessage(msg).then(sendResponse);
    return true; // Keep the channel open for sendResponse
  }
});

async function processMessage(msg) {
  console.log('Processing message', msg);
  // ... Handle the message processing here ...
  return 'foo';
}

替代解决方案:修补 API

将以下代码添加到每个使用的脚本的开头chrome.runtime.onMessage:

if ('crbug.com/1185241') { // Replace with a check for Chrome version that fixes the bug
  const {onMessage} = chrome.runtime, {addListener} = onMessage;
  onMessage.addListener = fn => addListener.call(onMessage, (msg, sender, respond) => {
    const res = fn(msg, sender, respond);
    if (res instanceof Promise) return !!res.then(respond, console.error);
    if (res !== undefined) respond(res);
  });
}

此补丁允许事件监听器返回异步函数或 Promise。

以上是如何让'sendResponse”等待 Chrome 扩展中的异步函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn