当前位置: 首页 > news >正文

浏览器插件消息通信:异步机制与数据获取避坑(ps:发送方收到的返回值是 undefined)

一、核心结论

  1. chrome.runtime.sendMessage(以及旧版 chrome.extension.sendMessage)是完全异步的。
  2. 接收方(onMessage)若包含耗时或异步操作,必须显式返回 true,否则发送方会立刻收到 undefined
  3. 发送方获取返回数据推荐使用 async/awaitPromise 写法,代码更简洁直观。

二、发送方:消息发送与数据获取

发送方通过 sendMessage 发出请求,并通过回调、Promise 或 await 接收接收方返回的数据。
 
chrome.runtime.sendMessage({ type: 'zhousavedata', data: '测试数据' }, (response) => {// response 即为接收方返回的数据console.log("获取到返回数据:", response); 
});

2. Promise 写法(现代)

chrome.runtime.sendMessage({ type: 'zhousavedata', data: '测试数据' }).then((response) => {console.log("通过 Promise 获取到的数据:", response);}).catch((error) => {console.error("消息发送失败:", error);});

3. async/await 写法(强烈推荐,最简洁)

async function sendData() {try {// 像写同步代码一样等待异步返回的结果const response = await chrome.runtime.sendMessage({ type: 'zhousavedata', data: '测试数据' });console.log("通过 await 获取到的数据:", response);} catch (error) {console.error("消息发送失败:", error);}
}
sendData();

三、接收方:异步处理与响应通道

接收方通过 onMessage 监听消息。如果监听器内部包含异步操作(如 setTimeoutfetchchrome.storage 等),必须保持消息通道打开。
1. 错误写法(通道被提前关闭)
如果不返回 true,监听器函数执行完毕后 Chrome 会立刻关闭通道。后续异步操作完成时调用 sendResponse 将失效,发送方会立刻收到 undefined
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {if (request.type === 'zhousavedata') {setTimeout(() => {// 此时通道已关闭,发送方收不到此数据sendResponse({ status: 'success', msg: '保存成功' }); }, 1000);// ️ 缺少 return true
    }
});

2. 正确写法(显式返回 true)
通过 return true 明确告知 Chrome 这是一个异步响应,请保持通道打开,等待后续的 sendResponse

chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {if (request.type === 'zhousavedata') {setTimeout(() => {sendResponse({ status: 'success', msg: '保存成功' }); }, 1000);//  关键:返回 true,声明这是一个异步响应return true; }
});

3. 最佳实践(直接返回 Promise)
直接返回一个 Promise,Chrome 会自动保持通道打开,并在 Promise resolve 时将结果发回给发送方。无需手动调用 sendResponsereturn true

chrome.runtime.onMessage.addListener((request, sender) => {if (request.type === 'zhousavedata') {// 直接返回 Promise,resolve 的内容即为发送给请求方的数据return new Promise((resolve) => {setTimeout(() => {resolve({ status: 'success', msg: 'Promise 异步处理完毕' });}, 1000);});}
});

四、常见问题排查清单

  • 发送方收到 undefined:检查接收方是否在异步操作外忘记写 return true,或者 sendResponse 被提前调用。
  • 数据无法传递:检查 sendResponseresolve 传递的数据是否包含不可序列化的对象(如 DOM 节点、函数、循环引用等)。
  • API 规范:现代 Chrome 插件开发中,官方推荐使用 chrome.runtime.sendMessage 替代较老的 chrome.extension.sendMessage
http://www.jsqmd.com/news/865413/

相关文章:

  • 【仅剩最后200份】DeepSeek内部《云原生AI平台SLA白皮书》精要版:含12项SLO指标定义、告警阈值公式与根因定位树
  • 2026 年西安建筑资质代办最新排名,本地企业首选推荐 - COINUP
  • 3秒免费获取百度网盘提取码:baidupankey智能工具终极指南
  • CyberChef:在浏览器中解决复杂数据处理难题的瑞士军刀
  • 面试中被嘲笑Token放在Redis里?这把给我干沉默了...
  • 北航毕业论文LaTeX模板:3天掌握专业排版,告别格式焦虑
  • SolidWorks自学day1-自留
  • 通过模型广场的直观对比与快速切换找到最适合当前任务的模型
  • 信创操作系统深度对比:统信UOS vs 麒麟OS vs openEuler,企业级选型指南
  • 广州婚纱照推荐|深耕品质美学,解锁多元婚拍新体验 - 品牌评测官
  • ARMv8/v9虚拟化核心:SCTLR_EL2寄存器详解与配置实践
  • 抖音批量下载器终极指南:3分钟掌握无水印高效下载技巧
  • OpenRGB:终结RGB灯光管理混乱的终极免费方案
  • 健康系列: 有机食品是什么?
  • 5G网络仿真软件哪个更高效?Ranplan两款核心产品深度解析
  • ColabFold深度解析:如何在云端解锁蛋白质结构预测的民主化革命
  • 全国网站开发服务商哪家好?2026年有实力的网站开发公司盘点 - 麦麦唛
  • 天津离婚财产分割权威律师:家理姜春梅,专注婚家 10 年 + - 外贸老黄
  • 10分钟搭建微信小程序商城:海风小店开源方案完全指南
  • AArch64 SCTLR_EL3寄存器解析与安全配置实践
  • 构建你的第一个中文手写识别系统:免费开源数据集完整指南
  • Armv8/v9架构SCTLRMASK_EL2寄存器解析与应用
  • 浙江大电流端子/电压端子厂家有哪些?2026年浙江直插式/回拉式接线端子厂家推荐|浙江端子板源头厂家推荐:连的智能领衔 - 栗子测评
  • 抖音资源下载终极指南:3步免费搞定无水印批量下载
  • 深度解析:PC消光剂——原理、应用与实践方案 - 资讯速览
  • 每日热门skill:Firecrawl深度研究报告-AI时代的网页数据抓取神器
  • 5个步骤彻底解决FanControl风扇控制软件配置崩溃问题
  • 内卷时代,品牌官网如何成为企业突围的“第二增长曲线”?
  • 2026现阶段太原万柏林区全屋定制哪家强?索菲亚旗舰店服务揭秘 - 2026年企业推荐榜
  • 证件照怎样快速换背景?2026年证件照背景更换软件对比与推荐指南 - AI测评专家