【问题标题】:When to use {:noreply, socket} vs {:reply, :ok, socket} in a Phoenix Channel?何时在 Phoenix 频道中使用 {:noreply, socket} 与 {:reply, :ok, socket}?
【发布时间】:2017-07-29 05:00:57
【问题描述】:

我正在构建一个与 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 请求,您总是检查来自客户端的请求是否成功。

【问题讨论】:

    标签: phoenix-framework phoenix-channels


    【解决方案1】:

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

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

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

    【讨论】:

    • 但是在那个例子中,确认只会发送给发送聊天的人(这很有用),而不是广播的接收者。
    • 当然,在你的例子中就可以了。我只是说一般来说,单向通信在 WebSockets 中很常见(因此有“noreply”选项)。
    猜你喜欢
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    • 2014-01-15
    • 1970-01-01
    相关资源
    最近更新 更多