Использование GenServer из другого модуля - PullRequest
0 голосов
/ 14 октября 2018

У меня есть простой GenServer, и вот он:

GenServer:

defmodule MyApp.ScoreTableQueue do
  use GenServer

  @impl true
  def init(stack) do
    {:ok, stack}
  end

  @impl true
  def handle_call(:pop, _from, state) do
    {:reply, state, []}
  end

  @impl true
  def handle_cast({:push, item}, state) do
    {:noreply, [item | state]}
  end
end

Я хочу использовать этот GenServer в этом модуле:

МОДУЛЬ:

  defp order_score(question, season) do
    for team <- season.teams do
      state = score_table_map(question, team)

      # Push state on GenServer queue
    end

    create_score_table(question, season)
  end

  defp score_table_map(question, team) do
    p_score = Enum.find(team.prediction_scores, &(&1.question_id == question.id))
    %{team_score: p_score.score, team_id: p_score.team_id}
  end

  defp create_score_table(question, season) do
    changeset = ScoreTable.changeset(%ScoreTable{
      question_id: question.id,
      season_id: season.id,
      table_details: %{
        information: # Pop state of genserver
      }
    })

    Repo.insert(changeset)
  end

Как указано в этом примере кода, я хочу выдвинуть какое-то состояние во время цикла на GenServer и после того, как я хочу вывести состояние на ревизии ниже.

Мой главный вопрос: как мне инициализировать genserver в другом модуле, и это лучший метод?

1 Ответ

0 голосов
/ 14 октября 2018

Вы не захотите инициализировать GenServer в другом модуле.Возможно, вы захотите добавить его в дерево контроля.

Вы также можете рассмотреть возможность добавления функций «API» в свой модуль GenServer, чтобы его пользователям не нужно было знать, что это GenServer.Что-то вроде

# This assumes you have named your GenServer the same as the module name
def push(item) do
  GenServer.call(__MODULE__, {:push, item})
end

def pop() do
  GenServer.call(__MODULE__, :pop)
end

Тогда вы можете просто вызывать его как обычные функции там, где вам это нужно.

MyApp.ScoreTableQueue.push(:foo)
stack = MyApp.ScoreTableQueue.pop()
...
...