如何获取chrome.tabs.sendMessage发送给所有框架的Promise数组响应?
获取所有框架的内容脚本响应并生成Promise数组
当扩展的manifest.json中设置all_frames: true后,内容脚本会注入到页面的所有框架中。要从其他脚本(如后台脚本、弹出脚本)向所有框架的内容脚本发消息并收集每个框架的响应Promise数组,可按以下步骤实现:
获取当前标签页的所有框架
通过chrome.tabs.query获取当前活跃标签页,再调用chrome.webNavigation.getAllFrames获取该标签页下的所有框架详情,提取每个框架的frameId。生成每个框架的消息Promise数组
遍历所有框架的frameId,对每个框架调用chrome.tabs.sendMessage,将每次调用返回的Promise存入数组,最终得到[Promise(框架1响应), Promise(框架2响应)...]的结构。
示例代码
// 后台/弹出脚本中执行 async function collectFrameResponses(message) { // 获取当前活跃标签页 const [activeTab] = await chrome.tabs.query({ active: true, currentWindow: true }); // 获取标签页下所有框架 const frames = await chrome.webNavigation.getAllFrames({ tabId: activeTab.id }); // 生成每个框架的消息Promise数组 const promiseArray = frames.map(frame => chrome.tabs.sendMessage(activeTab.id, message, { frameId: frame.frameId }) ); return promiseArray; } // 使用示例 collectFrameResponses({ type: "REQUEST_FRAME_DATA" }) .then(promises => { // 可单独处理每个Promise,或用Promise.all等待所有响应完成 Promise.all(promises) .then(allResults => console.log("所有框架响应结果:", allResults)) .catch(err => console.error("部分框架消息发送失败:", err)); });
更优实现建议
- 错误容错处理:给单个Promise添加catch逻辑,避免某一个框架消息失败导致整个Promise.all被拒绝,示例:
const promiseArray = frames.map(frame => chrome.tabs.sendMessage(activeTab.id, message, { frameId: frame.frameId }) .catch(err => ({ frameId: frame.frameId, error: err.message })) ); - 过滤无效框架:部分框架可能未注入内容脚本,可通过消息回调的错误信息过滤无效项,减少无效Promise。
- 性能优化:若页面框架数量较多,可分批发送消息,避免一次性发起过多请求影响页面性能。
内容的提问来源于stack exchange,提问作者FoxRefire
相关产品推荐
相关产品推荐

