私は例えば、単一の項目のための機能を実装しGenServerを持っている:Elixir GenServerハンドラ内から他の関数を呼び出す方法は?
def handle_call({:sync, id}, _from, state) do
## update data
{:reply, data, sync}
end
は今、私は複数のID、例えばのために、この機能を処理したい:
def handle_call({:sync_all, ids}, _from, state) do
## call sync for each id
data = Enum.map(ids, fn(id) ->
GenServer.call(self(), {:sync, id})
end)
## Further reduce down data to stats
{:reply, data, sync}
end
しかし、これは私に言っては動作しません。プロセスが自身を呼び出そうとしたことを示します。
これは、ブロックする性質がcall
であることが必要であると仮定します。しかし、sync_all
バージョンでcast
を使用すると同じことが起こります。
私の質問は次のとおりです。handle_call
またはhandle_cast
の中から他のGenServer
タスクをどのように呼び出すことができますか?あなたは、通常このような場合にはどうなるのか
'cast'は' handle_call'の内部で動作するはずです。あなたはそれを行い、あなたのために働かなかったコードのバージョンを投稿できますか? – Dogbert