#elixir #phoenix-framework
#elixir #phoenix-framework
Вопрос:
Я пытаюсь назначить аватар, но при попытке его использования я получаю сообщение об ошибке.
Я исхожу из фона узла, где я могу присваивать значения, а затем изменять их из запросов. На что мне следует обратить внимание для поддержания состояния?
defmodule Chatroom.LobbyChannel do
require Runner
use Phoenix.Channel
{:ok, pid: spawn(fn -> Runner.input() end)}
avatar = %{x: 0, y: 0}
def join("lobby", _payload, socket) do
{:ok, socket}
end
def handle_in("new_message", payload, socket) do
case payload["message"] do
"hello" -> broadcast! socket, "new_message", payload
"jump" -> send pid, {:jump, self, [avatar: avatar, socket: socket]}
_ -> nil
end
{:noreply, socket}
end
def handle_reply do
receive do
{:result, mover, socket} -> broadcast! socket, "new_message", [name: "State", message: "5"]
end
end
end
Ответ №1:
Поверх GenServer
есть абстракция, которая называется Agent
. Из документации:
Агенты — это простая абстракция вокруг состояния.
Часто в Elixir возникает необходимость совместного использования или сохранения состояния, к которому необходимо обращаться из разных процессов или одним и тем же процессом в разные моменты времени.
Модуль агента предоставляет базовую реализацию сервера, которая позволяет извлекать и обновлять состояние с помощью простого API.
Agent
не зависит от Phoenix, это для всего Elixir. В руководствах по Elixir есть отличное руководство по этому вопросу.
Комментарии:
1. Спасибо — где бы мне запустить свой агент? Похоже, что start_link используется для связывания функции перед ее использованием. Куда бы это делось в стеке Phoenix?
2. Это зависит от жизненного цикла вашего агента. Если вам нужно, чтобы он был доступен всегда, запустите его в главном приложении в качестве контролируемого работника.