在 Phoenix Channel 中何时使用 {:noreply, socket} 与 {:reply, :ok, socket}?

When to use {:noreply, socket} vs {:reply, :ok, socket} in a Phoenix Channel?

我正在构建一个 Javascript 客户端应用程序,它与 Phoenix 服务器进行实时通信,想知道是否已收到推送到服务器的消息。看起来 Phoenix 的 socket.js 希望我使用类似的东西:

channel.push("mymessage", {data: 123})
  .receive("ok", function(){ console.log("Message pushed successfully"); });

但是,除非我将 Phoenix 应用程序上的 return 值更改为 {:reply, :ok, socket},否则我无法触发此事件处理程序,如下所示:

  def handle_in("mymessage", %{"data" => data} = payload, socket) do
    {:reply, :ok, socket}
    # not {:noreply, socket}
  end

我想 {:noreply, socket} 实际上并没有发送消息来响应客户端是有道理的,但是在什么情况下你想向服务器发送消息而不让它让你知道它有效吗?还是我误会了什么?我觉得对于普通的 HTTP 请求,您 总是 检查客户端的请求是否成功。

你是对的:{:reply, :ok, socket} 将发送 reply message"ok",而 {:noreply, socket} 不会发送任何响应。如果您想确保消息已发送,您应该使用前者,但这通常是不切实际或不必要的(考虑向成千上万的连接用户广播聊天消息——跟踪所有用户的 "ack" 消息是不切实际的).

I feel like with normal HTTP requests, you always check if the request was successful from the client.

WebSockets 存在于正常 HTTP 请求不能正常工作的情况下,单向通信就是其中一种情况。