Search⌘ K
AI Features

Introduce Calls and Casts

Explore how to implement and handle GenServer calls and casts in Elixir. Learn to create synchronous calls that return data and asynchronous casts that update state without replying, improving concurrency management.

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 ...