GenServer 有 3 个主要回调:handle_cast、handle_call 和 handle_info。这些函数中的每一个都可以有多个子句,每个子句都实现了一个特定的功能。
例如,假设我有一个作为 GenServer 实现的 UserService 模块,具有 5 个操作:create、show、index、update 和 delete。让我们进一步假设我将delete 实现为异步操作(因此使用handle_cast),其余作为同步操作(使用handle_call)。
def handle_call({:create, user_data}, _from, state) do
new_user = User.create(user_data) // (However you create a user)
{:reply, new_user, state}
end
def handle_call(:index, _from, state) do
users = User.all
{:reply, users, state}
end
def handle_call({:update, user_changes}, _from, state) do
updated_user = User.update(user_changes)
{:reply, updated_user, state}
end
def handle_call({:show, user_id}, _from, state) do
user = User.get(user_id)
{:reply, user, state}
end
def handle_cast({:delete, user_id}, state) do
User.delete(user_id)
{:no_reply, state)
end
客户端模块可以调用user = GenServer.call(pid, {:show, user_id}) 来使用show 子句。主要收获是,即使只定义了几个“函数”,您也可以根据需要定义该函数的任意多个子句,并且模式匹配将分派到正确的子句。