Catch if runtime.sendMessage 没有收到响应

Catch if runtime.sendMessage doesn't receive response

假设我们有一个与浏览器操作弹出窗口通信的后台脚本。

在某些情况下,我想向弹出窗口发送消息。首先,我需要了解弹出窗口是否完全打开(可以使用 chrome.extension.getViews({ type: "popup" }))。其次,我想向该弹出窗口发送一条消息。问题是我只想在某些异步任务之后将 runtime.onMessage 侦听器放在弹出窗口中,因此我们会得到的是,如果打开弹出窗口,我们将尝试向那里发送消息,它将产生错误,因为 runtime.sendMessage 方法将尝试向未设置的(尚未)发送消息 runtime.onMessage听众。

由于 chrome API 中的处理方式,我找不到捕获该错误的方法。基本上我想要的是如果我试图向未设置的 runtime.onMessage 侦听器发送消息,则能够 捕获 错误.

应该可以通过检查 sendMessage 的回调中的 chrome.runtime.lastError 来捕获错误:

chrome.runtime.sendMessage('foo', data => {
  if (chrome.runtime.lastError) {
    console.log('Yay');
  } else {
    // use data
  }
});

P.S。在后台脚本和弹出脚本等两个扩展页面之间进行通信时,您可能不需要使用扩展消息传递,因为它很慢(它在内部序列化为 JSON)。您可以在弹出脚本中使用 chrome.runtime.getBackgroundPage 或 chrome.extension.getBackgroundPage 直接访问后台脚本的 window 对象及其全局变量。您还可以使用 BroadcastChannel API,它利用快速结构化克隆算法,能够传输比 JSON-based 扩展消息传递更多的对象类型。