You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取chrome.tabs.sendMessage发送给所有框架的Promise数组响应?

获取所有框架的内容脚本响应并生成Promise数组

当扩展的manifest.json中设置all_frames: true后,内容脚本会注入到页面的所有框架中。要从其他脚本(如后台脚本、弹出脚本)向所有框架的内容脚本发消息并收集每个框架的响应Promise数组,可按以下步骤实现:

  1. 获取当前标签页的所有框架
    通过chrome.tabs.query获取当前活跃标签页,再调用chrome.webNavigation.getAllFrames获取该标签页下的所有框架详情,提取每个框架的frameId。

  2. 生成每个框架的消息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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 01:54:53