【问题标题】:Phoenix LiveView socket and en external socketPhoenix LiveView 插座和外部插座
【发布时间】:2019-12-26 16:46:03
【问题描述】:

由于我还在学习凤凰,我需要帮助,如果这看起来很琐碎,请见谅。

我有一个简单的 LiveView 来查看对象在 3D 空间中的位置,该位置来自外部套接字,这是我处理传入位置的方式

def handle_in("new_msg", %{"x" => posX, "y"=> posY, "z" => posZ}, socket) do
    GameLive.handle_event("new_position", %{"x" => posX, "y" => posY, "z" => posZ}, socket)
    broadcast!(socket, "new_msg", %{x: posX, y: posY, z: posZ})
    {:reply, {:ok, %{response: "Updated"}}, socket}
end

这是我处理事件的方式

def handle_event("new_position", %{"x" => posX, "y" => posY, "z" => posZ}, socket) do
    {:noreply, assign(socket, %{x: posX, y: posY, z: posZ})}
end

每当我尝试更新位置时都会收到此错误

[error] GenServer #PID<0.481.0> terminating
** (FunctionClauseError) no function clause matching in Phoenix.LiveView.assign/2
    (phoenix_live_view) lib/phoenix_live_view.ex:1252: Phoenix.LiveView.assign(%Phoenix.Socket{assigns: %{}, channel: GameviewWeb.RoomChannel, channel_pid: #PID<0.481.0>, endpoint: GameviewWeb.Endpoint, handler: GameviewWeb.UserSocket, id: nil, join_ref: "3", joined: true, private: %{log_handle_in: :debug, log_join: :info}, pubsub_server: Gameview.PubSub, ref: "4", serializer: Phoenix.Socket.V2.JSONSerializer, topic: "room:lobby", transport: :websocket, transport_pid: #PID<0.478.0>}, %{x: 5, y: 5, z: 5})

我现在明白我正在向Phoenix.LiveView.assign/2 传递一个不同类型的套接字,因为它需要一个Phoenix.LiveView.Socket,而我正在传递一个Phoenix.Socket。感谢Elixir Forum Community

我应该如何处理这种情况,我正在寻找具有良好实践的解决方案。 提前致谢。

【问题讨论】:

    标签: phoenix-framework


    【解决方案1】:

    我找到的最佳解决方案是使用应用发布者/订阅者设计模式的Pubsub。在 Pubsub 通知订阅者后,您可以根据需要使用不同的逻辑在每个订阅者处处理事件,而不会混淆套接字。

    【讨论】:

      猜你喜欢
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 2017-07-19
      • 2011-07-09
      • 2014-10-01
      • 1970-01-01
      相关资源
      最近更新 更多