作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
据我了解,我应该通过发送消息使用 handle_cast
进行异步请求,然后通过客户端的 receive..end
对响应使用react。
这是一个例子:
Pid ! {auth_user, {User, Password}}.
对于同步请求,当我想等待 gen_server
发送响应时,我必须从模块中显式调用相应的函数,如下所示:
{ok, Result} = auth_server:auth_user({User, Password}).
上面的说法正确吗?
如果后者是正确的,如果我已经有一个导出函数auth_user
,为什么我需要这样的构造?
handle_call({authenticate_user, {Login, Password}}, _From, _) ->
{reply, {}, {}}.
最佳答案
您不会通过像这样直接发送消息来与 gen_server
进行交互。您应该像这样使用 gen_server:call
或 gen_server:cast
:
Response = gen_server:call(Pid, {auth_user, {User, Password}})
call
/cast
将处理向 Pid
发送消息(并接收 call
的响应)本身,以及许多边缘情况,例如在响应您的请求之前进程崩溃等。
当您想要在多个调用之间存储某些状态时,If the latter is correct, why then I need a construction like this if I already have an exported function
auth_user
?
gen_server
非常有用。例如,如果您想在内存中保留应用中页面浏览量的全局计数器,则应使用 gen_server
,将计数器存储为 的状态并进行 cast
或在每次请求时调用
。如果没有要保留的状态,则应该使用普通函数。
关于erlang - 如何在 Erlang gen_server 中使用handle_cast和handle_call?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38950561/
我是一名优秀的程序员,十分优秀!