Когда использовать {:noreply, сокет} vs {:reply,:ok, socket} в канале Феникса?

Я создаю клиентское приложение Javascript, которое имеет прямую связь с сервером Phoenix и хочет знать, было ли получено сообщение, отправленное на сервер. Похоже, что сокет 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-запросами, вы всегда проверяете, был ли запрос успешным с клиента.

1 ответ

Ты прав: {:reply, :ok, socket} отправит ответное сообщение с "ok", а также {:noreply, socket} ничего не отправлю в ответ. Вы должны использовать первое, если хотите убедиться, что сообщение было отправлено, но часто это нецелесообразно или не нужно (подумайте о рассылке сообщения чата тысячам подключенных пользователей - нецелесообразно отслеживать сообщения "ack" для всех них).

Я чувствую, что с нормальными HTTP-запросами, вы всегда проверяете, был ли запрос успешным с клиента.

WebSockets существуют для ситуаций, когда обычные HTTP-запросы не работают, и односторонняя связь является одним из таких случаев.

Другие вопросы по тегам