0
我正在製作可發送/接收異步消息的基本Elixir服務器/客戶端模塊。該模塊看起來像下面。Elixir:如何在handle_cast中向服務器發送通知?
defmodule Bitcoin.WorkerOne do
use GenServer
def start_link(opts) do
IO.puts " - Worker 1 started - "
GenServer.start_link(__MODULE__,:ok, opts)
end
def set_message(server, name, mid) do
GenServer.cast(server, {:set_message, name})
end
#callbacks
def init(:ok) do
names = []
{:ok, names}
end
def handle_cast({:set_message, name},names) do
IO.puts "- new state is - "
names = names ++name
IO.inspect names
{:noreply,names}
end
end
我通過iex控制檯使用啓動進程。
{:ok, pid1} = Bitcoin.WorkerOne.start_link([])
Bitcoin.WorkerOne.get_message(pid1, ["one"])
之後,狀態變爲['one'](最初爲空列表)。我想向服務器發送狀態已更新的通知。我可以在handle_cast
內撥打'Genserver.cast'
,以便發回消息嗎?
在handle_call的情況下,它將等待任務完成。 「{:noreply,state}」是否可以解決這個問題? – COSTA
當您需要回復或保證服務器收到請求並對其進行操作時,使用來自客戶端的呼叫很重要。如果您返回'{:noreply,state}',則預計您已使用'GenServer.reply/2'回覆或將來回復。這使您可以控制何時發送答覆,同時保持呼叫提供的保證,包括處理超時和崩潰。來電者將會阻止,但您可以儘早回覆以最大限度地減少該信息,或者如果請求真的被觸發並忘記,則可以與施法者的pid一起使用施法。 – bitwalker