回调函数在GenServer中运行

时间:2016-05-02 12:35:05

标签: elixir gen-server

我是Elixir的初学者,我正在努力了解如何使用GenServer。对我来说神奇的是:

defmodule Stack do
  use GenServer

  # Callbacks

  def handle_call(:pop, _from, [h|t]) do
    {:reply, h, t}
  end

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

代码取自GenServer docs。为什么call函数只返回一个值,然后回调函数返回{:reply, h, t}

#Start the server
{:ok, pid} = GenServer.start_link(Stack, [:hello])

# This is the client
GenServer.call(pid, :pop)
#=> :hello #<<<<Why?

{:reply, h, t}不是返回的值吗?

1 个答案:

答案 0 :(得分:3)

  

{:reply, h, t}不是返回值吗?

{:reply, h, t}handle_call的返回值,但您没有调用该函数。您正在调用GenServer.call,内部调用handle_call,向其传递消息,调用方和当前状态,如果handle_call返回3个{:reply, a, b}元组,则将第二个参数(在本例中为a)发送给调用者,并将其状态更改为b