我正在使用Chrome扩展程序,即将在我的后台页面和内容脚本之间实现一些消息传递,它将需要大约3条消息(内容 - >背景 - >内容 - >背景)以同步的顺序。
我不确定传递API的消息应该用于此,因为我不太了解端口API和普通chrome.runtime
API之间的区别。我可以使用runtime.sendmessage
来处理Port.postMessage
吗?任何可能让我选择其中一个的重大差异?
答案 0 :(得分:6)
端口是可重复使用的双向连接。
单个邮件遵循相同的方案,并不关心调用之间的状态:
sendMessage
- > onMessage
(可选 - >)sendResponse
- >回调sendMessage
你可以通过该计划做任何事情。
端口可能有三个方面让我觉得很有意思。
sendMessage
是广播操作。
如果是runtime.sendMessage
,则会将其发送到属于扩展程序的所有活动页面。通常,只有一个人会听(背景页面),但每个人都会收到它。因此,如果你有一个弹出窗口或一个选项页面打开 - 每个人都会收到。您可以使用端口来保存一小部分资源,或隔离页面实例。
如果是tabs.sendMessage
,它会默认发送到该标签中的所有框架。您可以指定frameId
,如果您知道,但假设您没有,并且您正在向所有帧广播,那么确定哪个帧是正确的 - 您可以维护该框架的端口。
开放端口保持Event Page清醒。如果您正在执行可能会卸载事件页面的异步操作,这将非常有用。如果你真的不关心事件页面保持清醒,这也是一个缺点 - 它阻止了
提供的改进一个端口是一个"死亡警报":如果另一端的上下文不再存在(例如卸载了上下文脚本的页面),你&# 39;将由onDisconnect
通知
除非您需要以上任何一项,否则您可以使用更简单的sendMessage
- onMessage
通讯。
出于您的目的,将从内容脚本中调用sendMessage
两次(因为它启动连接)并从sendResponse
中的后台回复。如果需要,请不要忘记nuance about async responses。