我正在构建一个与Phoenix服务器进行实时通信的Javascript客户端应用程序,并想知道是否已收到推送到服务器的消息。看起来凤凰城的socket.js希望我使用类似的东西:
channel.push("mymessage", {data: 123})
.receive("ok", function(){ console.log("Message pushed successfully"); });
但是,我无法启动此事件处理程序,除非我将Phoenix应用程序的返回值更改为{:reply, :ok, socket}
,如下所示:
def handle_in("mymessage", %{"data" => data} = payload, socket) do
{:reply, :ok, socket}
# not {:noreply, socket}
end
我认为{:noreply, socket}
实际上并没有响应客户端发送消息是有意义的,但是在什么情况下你想要向服务器发送消息而不让它让你知道它有效吗?还是我误解了什么?我觉得在正常的HTTP请求中,您总是检查请求是否来自客户端。
答案 0 :(得分:0)
您是对的:{:reply, :ok, socket}
会发送reply message "ok"
,而{:noreply, socket}
不会发送任何回复。如果你想确保邮件被发送,你应该使用前者,但这通常是不切实际或不必要的(想想向成千上万的连接用户广播聊天消息 - 跟踪所有这些消息的“确认”消息是不切实际的)。
我觉得对于正常的HTTP请求,您总是检查请求是否来自客户端。
WebSockets适用于普通HTTP请求无法正常工作的情况,单向通信就是其中之一。