Как мне сохранить переменные в памяти с помощью Phoenix?

#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. Это зависит от жизненного цикла вашего агента. Если вам нужно, чтобы он был доступен всегда, запустите его в главном приложении в качестве контролируемого работника.