首页 > web前端 > js教程 > 如何解决 Chrome 的 `chrome.tabs.sendMessage` 中的'sendResponse 不等待异步函数或 Promise 的解析”?

如何解决 Chrome 的 `chrome.tabs.sendMessage` 中的'sendResponse 不等待异步函数或 Promise 的解析”?

Mary-Kate Olsen
发布: 2024-11-29 03:52:08
原创
223 人浏览过

How to Resolve

排查“sendResponse 不等待异步函数或 Promise 的解析”

问题:
Chrome 的 chrome。 tabs.sendMessage的sendResponse函数不等待异步函数或 Promise 解决方案。

问题分析:

在提供的代码中,内容脚本 (contentscript.js) 中的 getThumbnails 函数是一个异步函数,需要时间执行。但是,onMessage 侦听器中的 sendResponse 函数会立即调用,可能在 getThumbnails 完成执行之前调用。这会导致 sendResponse 在响应中返回 undefined 或 null。

解决方案 1:删除 Async 关键字并声明单独的异步函数

  • 从 onMessage 中删除 async 关键字监听函数。
  • 创建一个单独的异步函数来处理消息
  • 从 onMessage 侦听器调用单独的异步函数并适当处理响应。

解决方案 2:修补异步侦听器的 API

  • 在所有使用 chrome.runtime.onMessage 的脚本中使用之前添加补丁
  • 补丁重新定义了 addListener 方法,以在监听器内启用 Promise 或异步函数响应。

Contentscript.js 中的实现:

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.message === "get_thumbnails") {
    getThumbnails().then(payload => {
      sendResponse({ payload });
      return true;  // Keep messaging channel open for sendResponse
    });
  }
});

async function getThumbnails() {
  // Your code to retrieve thumbnails
}
登录后复制

实施补丁:

// Patch to allow async/Promise listener
if ('crbug.com/1185241') {  // Replace with Chrome version check
  const { onMessage } = chrome.runtime;
  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);
  });
}

chrome.runtime.onMessage.addListener(async msg => {
  if (msg === 'foo') {
    const res = await fetch('https://foo/bar');
    const payload = await res.text();
    return { payload };
  }
});
登录后复制

以上是如何解决 Chrome 的 `chrome.tabs.sendMessage` 中的'sendResponse 不等待异步函数或 Promise 的解析”?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板