我正在尝试实现一个通过套接字更新 DOM 的 Turbo Stream。我有以下设置:
我认为:
<%= turbo_stream_from "connections_notifications" %>
在控制器中,我触发了一个作业:
PrepSidenavJob.perform_later(current_user)
作业广播 Turbo Stream:
Turbo::StreamsChannel.broadcast_replace_to(
"connections_notifications",
target: "connections_notification",
partial: 'product/sidenav_badge',
locals: {count: connections_notification},
layout: nil
)
我遇到了具有以下事件顺序的竞争条件:
作业执行速度太快,以至于广播在客户端连接到 Websocket 之前发生,导致客户端错过更新。
我正在使用以下版本:
任何有关此设置为何未按预期工作的见解将不胜感激。
我目前面临同样的问题,并认为我们使用的基本设置不正确。 ActionCable/TurboStreams 假定您在提交作业之前已建立
/cable
连接。
/cable
另一种解决方案可能是在服务器上发生新连接时触发初始更新。这可以通过以下方式完成:https://api.rubyonrails.org/classes/ActionCable/Channel/Callbacks.html我相信可以通过
after_subscribe :send_update..., unless: :subscription_rejected?
来完成
顺便说一句,似乎很多人都有同样的问题: