iT邦幫忙

2024 iThome 鐵人賽

DAY 11
0

call

與 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


上一篇
10 GenServer 訊息
下一篇
12 Client/Server API 區分
系列文
Elixir 多工 : Processes 與 OTP30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言