如何在ActionCable订阅的回调中向客户端传输初始负载



我有一个RubyonRails应用程序,它使用ActionCable进行实时客户端通信。我有ScoreChannel,它负责流式用户分数更新:

class ScoreChannel < ApplicationCable::Channel
  def self.broadcast_name(user:)
    "score_#{user.guid}"
  end
  def broadcast_name
    self.class.broadcast_name(user: current_user)
  end
  def subscribed
    stream_from(broadcast_name)
    ActionCable.server.broadcast(broadcast_name, Cable::V1::ScoreSerializer.new(current_user).as_json)
  end
end

我试图在用户订阅频道后立即发送用户的当前分数(请参阅ScoreChannel#subscribed方法(。不幸的是,由于ActionCable的异步特性,分数广播在用户订阅ScoreChannel之前进行。因此,用户没有接收到初始分数有效载荷(因为他还没有订阅该频道(。这是redis监视器时间表:

1472430005.884742 [1 172.18.0.6:50242] "subscribe" "action_cable/Z2lkOi8vYXBwLWVuZ2luZS9Vc2VyLzE"
1472430010.988077 [1 172.18.0.6:50244] "publish" "score_cc112e3fdfb5411a965a31f9468abf98" "{"score":17,"rank":1}"
1472430010.988773 [1 172.18.0.6:50242] "subscribe" "score_cc112e3fdfb5411a965a31f9468abf98"

解决这个问题的最佳方法是什么?

不要使用ActionCable.server.broadcast向现有订户广播,而是尝试使用transmit-方法,如下所示:

transmit(Cable::V1::ScoreSerializer.new(current_user).as_json)

这只会将状态发送给正在处理的当前订阅者,但我认为这正是您想要的。

在通道类/实例中使用transmit,引用ActionCable::Channel::Base#transmit

在通道类外使用broadcast,参考ActionCable::Server#broadcast

相关内容

  • 没有找到相关文章

最新更新