與 cast 非常相似,但是 handle_call/3
要求的回傳格式不同
這次要回傳的 tuple 裡分別是 {:reply, reply, new_state}
:reply
代表會回傳訊息給呼叫的人reply
指的是這次要回的訊息new_state
是目前 process 要保留的狀態依照我們目前的情境只是要回傳帳戶餘額, reply 與 new_state 都用目前的狀態 (balance) 即可:
defmodule Bank do
use GenServer
def init(init_balance) do
IO.puts("開戶存了 #{init_balance} 元。")
{:ok, init_balance}
end
def handle_cast({:add, n}, balance) do
new_state = balance + n
IO.puts("存入 #{balance} 元。")
{:noreply, new_state}
end
def handle_call(:check_balance, _from, balance) do
IO.puts("檢查餘額,目前有 #{balance} 元")
{:reply, balance, balance}
end
end
接著使用 GenServer.call/2
來呼叫他
iex(2)> {:ok, pid} = GenServer.start_link(Bank, 3000)
開戶存了 3000 元。
{:ok, #PID<0.117.0>}
iex(3)> GenServer.cast(pid, {:add, 400})
存入 3000 元。
:ok
iex(4)> GenServer.call(pid, :check_balance)
檢查餘額,目前有 3400 元
3400