我使用执行javascript调用在服务器上执行操作,如下所示:
subscription.perform('action', {...});
但是,从我所看到的情况来看,似乎没有内置的javascript"成功"回调,即让我知道该行动是在服务器方面结束的(或可能是失败的)。我正考虑在行动结束时发送广播,如下:
def action(data)
...do_stuff
ActionCable.server.broadcast "room", success_message...
end
但是所有客户都订阅了这个"房间"会收到该消息,可能导致误报。此外,根据我所听到的情况,消息顺序无法保证,因此此操作中的先前广播可以在成功消息之后传递,可能会导致进一步的问题。
有关于此的任何想法,还是我完全错过了什么?
答案 0 :(得分:2)
查看https://github.com/xtian/action-cable-js/blob/master/dist/cable.js和https://developer.mozilla.org/en-US/docs/Web/API/WebSocket#send(),perform
只执行WebSocket.send()
并返回true或false,并且无法知道您的数据是否已到达。 (这似乎是WebSockets无法实现的。)
您可以尝试仅使用http呼叫(我建议使用jbuilder设置api),或者确实广播回成功消息。
您可以通过在服务器上创建时间戳并将其与消息一起发送,然后使用Javascript对消息进行排序来解决消息的顺序。
祝你好运!答案 1 :(得分:0)
也许您正在寻找的是 trasmit 方法:https://api.rubyonrails.org/v6.1.3/classes/ActionCable/Channel/Base.html#method-i-transmit
它向正在为通道处理的当前连接发送一条消息。