行动电缆:如何传递错过的聊天消息
Posted
技术标签:
【中文标题】行动电缆:如何传递错过的聊天消息【英文标题】:Action Cable: How to deliver missed chat messages 【发布时间】:2016-12-17 22:44:04 【问题描述】:有什么好的方法可以在聊天中传递错过的消息,例如使用 Action Cable?就像当您关闭笔记本电脑并再次打开它时,您并没有重新加载页面,但您可能错过了消息
一种方法是使用Action Cable 进行AJAX 调用,但随后我将不得不复制您收到消息时发生的一些逻辑。如果可能的话,我想重复使用 Action Cable
【问题讨论】:
包括你的一些动作cable JS。 【参考方案1】:当然将它们存储在数据库中。并在您每次重新订阅 Action Cable 时从数据库中加载它们。
【讨论】:
为什么要投反对票?否则你不可能这样做。【参考方案2】:我假设您已经看到(read_at timestamp)每条消息的状态,并且您的 web-socket 没有关闭(关闭笔记本电脑或关闭浏览器会关闭它)。
我会创建后台任务来检查所有订阅频道是否有未见消息。 假设您有用户订阅的频道“message_234”,并且那里有一些消息,其中 read_at 在您的表中为零。然后使用您的后台任务将它们广播给您的用户。 将超时设置为 1 天以不使其超载并对您的 message_notification 通道执行相同操作。
【讨论】:
【参考方案3】:您可以使用#transmit
在#subscribed
中发送过去的消息。
不幸的是,这种方便的方法几乎没有记录,也没有在当前的edge guide for Action Cable 中提及。但应该在引入 Action Cable 后的所有版本中都可以使用。
这是一个例子:
def subscribed
lobby = Lobby.find(params[:lobby])
stream_from(stream_name)
lobby.messages.order(created_at: :asc).each do |message|
transmit(message.to_json)
end
end
【讨论】:
以上是关于行动电缆:如何传递错过的聊天消息的主要内容,如果未能解决你的问题,请参考以下文章
从 ejabberd 检索聊天记录时如何识别已发送和未发送的消息?