Introduce Calls and Casts
Learn how to introduce calls and casts in GenServer.
We'll cover the following...
GenServer
calls
More often than not, we want a meaningful response when we send a GenServer
process a message. We might query the process’s state, or we might want to see the result of a command we’ve sent it. This is where calls come in.
GenServer
calls are synchronous. They can return any arbitrary value to the caller, and if the caller is waiting for a return, it blocks until it gets one. handle_call/3
is the GenServer
callback that handles calls. It’s similar to handle_info/2
in that its pattern matches a message as its first argument.
It’s different from handle_info/2
since it doesn’t accept messages sent directly from other processes. Instead, it’s triggered whenever we call GenServer.call/2
.
Let’s try this out. In lib/islands_engine/game.ex
, we add a clause of handle_call/3
that looks like this:
def handle_call(:demo_call, _from, state) do
{:reply, state, state}
end
Our aim is to have it return to the initial server state.
The key here is the first argument, :demo_call
. This is the pattern that determines which clause of handle_call/3
to execute. We’ll see where it comes from shortly. Don’t worry about the other arguments. GenServer
provides them internally.
The return value is ...