如果runtime.sendMessage没有收到响应,则捕获

问题描述

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

在某些情况下,我想向弹出窗口发送消息。首先,我需要确定是否完全打开了弹出窗口(可以使用 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,该API利用了快速结构化的克隆算法,该算法比基于JSON的扩展消息传递功能能够传输更多的对象类型。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...