2

我正在构建一个与 Phoenix 服务器进行实时通信的 Javascript 客户端应用程序,并且想知道是否收到了推送到服务器的消息。看起来 Phoenix 的 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 请求,您总是检查来自客户端的请求是否成功。

4

1 回答 1

0

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

我觉得对于普通的 HTTP 请求,您总是检查来自客户端的请求是否成功。

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

于 2017-07-28T21:00:57.783 回答