我有Ruby on Rails应用程序,它使用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"
解决这个问题的最佳方法是什么?
答案 0 :(得分:0)
不要使用ActionCable.server.broadcast
向现有订阅者广播,而是尝试使用transmit
- 方法,如下所示:
transmit(Cable::V1::ScoreSerializer.new(current_user).as_json)
这只会将状态发送给正在处理的当前订阅者,但我认为这是您想要的。