可以打开多个使用chrome.runtime.onMessage.addListener的Chrome扩展页面吗?

问题描述 投票:0回答:1

我遇到了一种奇怪的情况,其中一个内容页面似乎破坏了所有其他页面的后台脚本通信。

这很奇怪,因为我可以看到调用通过 DevTools 中的后台脚本进行,但是一旦我打开主要内容页面的副本 chrome-extensions://xxx/index.html 所有其他页面都需要chrome.runtime.sendMessage 没有得到结果。

我不确定这是否与这里的警告有关:

注意:如果多个页面监听 onMessage 事件,则仅监听 onMessage 事件 首先为特定事件调用 sendResponse() 将成功 发送响应。对该事件的所有其他响应将是 忽略。

说实话,我发现这段文字对我来说有点含糊。我认为这意味着在处理程序中,

sendResponse()
只能被调用一次,但这不是这里发生的情况,因为内容
sendMessage()
是一个单独的页面/进程。

话又说回来,它说“多页”,这是否意味着一次只能使用一页

browser.runtime.onMessage.addListener()

我被难住了。

如果我关闭任何主要内容页面(构建最复杂的页面)并打开一些更简单的内容页面(仅在加载时调用一次后台脚本),则更简单的内容页面(没有侦听器) )一切工作。

一旦我打开主要内容页面(带有侦听器),简单的页面就不再工作,如果我打开两个主要内容页面,则两个页面(带有侦听器)都不起作用。

我的消息发送封装在一个帮助程序库中,我用它来序列化和处理传递的消息中的错误,此外,我还使用 Web 扩展 Polyfill 为我提供更好的基于承诺的 API,但它一直在与我的所有内容一起工作。在过去的两个月里我已经尝试过了,这个应用程序很复杂。

我正在使用一次性发送消息格式:

browser.runtime.sendMessage(id || null, payload).then( ... )

下一步是查看长期连接。

我确信这一定是其他人遇到过的问题。

有人遇到过类似的事情吗?

干杯, 戴夫

google-chrome-extension firefox-addon
1个回答
0
投票

对于任何阅读本文并遇到相同或类似问题的人,我最终弄清了问题的根源,答案是第一个响应的听众赢得了比赛,而所有后续的听众都被忽略。

编写一个强大的跨进程消息传递解决方案实际上非常复杂,需要考虑各种错误和边缘情况,因此截至 2023 年,我重新审视了我的代码,重新编写了它,并将其提取到一个独立的库中:

它解决了几乎所有消息传递用例,与 MV2 和 MV3 兼容,极其有详细的文档记录,并且代码经过自由地注释(如果您希望了解幕后情况)。

希望它能让您的分机消息传递变得更加轻松。

© www.soinside.com 2019 - 2024. All rights reserved.