我有一个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