turbo_stream_from -> 活动作业 -> 广播竞争条件?

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

我正在尝试实现一个通过套接字更新 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
)

我遇到了具有以下事件顺序的竞争条件:

  1. 渲染第一个模板
  2. 放弃工作
  3. 工作流程
  4. 工作广播
  5. 客户端连接到/cable
  6. 客户什么也没收到

作业执行速度太快,以至于广播在客户端连接到 Websocket 之前发生,导致客户端错过更新。

我正在使用以下版本:

  • Rails 7.2
  • @hotwired/turbo-rails 8.0.12

任何有关此设置为何未按预期工作的见解将不胜感激。

ruby-on-rails hotwire-rails turbo turbo-rails
1个回答
0
投票

我目前面临同样的问题,并认为我们使用的基本设置不正确。 ActionCable/TurboStreams 假定您在提交作业之前已建立

/cable
连接。

  1. 访问页面并连接到
    /cable
  2. 通过 Turbo 提交表格(无需重新加载页面)
  3. 控制器返回表单的 Turbo 替换并开始后台作业
  4. 后台作业广播更新以替换

另一种解决方案可能是在服务器上发生新连接时触发初始更新。这可以通过以下方式完成:https://api.rubyonrails.org/classes/ActionCable/Channel/Callbacks.html我相信可以通过

after_subscribe :send_update..., unless: :subscription_rejected?

来完成

顺便说一句,似乎很多人都有同样的问题:

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