我有JavaScript经验,我习惯回调函数:
function myFun(arg1, arg2, successCB, failCB) {
var sum = arg1 + arg2;
if (sum > tooHigh) {
failCB("too high!");
} else {
otherFun(sum, arg1, successCB, failCB);
}
}
我可以在Erlang中编写相同的代码:
my_fun(Arg1, Arg2, SuccessCB, FailCB) ->
case Arg1 + Arg2 of
Sum when Sum > ?TOO_HIGH ->
FailCB(too_high);
Sum ->
other_fun(Sum, Arg1, SuccessCB, FailCB)
end.
根据我的经验,我发现这种方法是合理的,但我觉得我需要在我的代码中做很多这样的事情,所以,显然,有一种更好的方法来管理这些真/假/无论什么情况。
这是典型的Erlang代码吗?还有其他方法我应该这样做吗?
答案 0 :(得分:0)
JavaScript使用回调,因为你有一个单独的线程,回调就是你跨上下文切换传输状态的方式。
回调函数是一个通用的工具,但在JavaScript中它们是基础工具,因为它是异步工作的完成方式。
在Erlang中,您可以(并且应该!)使用许多进程。在单个进程中,您可以进行同步阻塞调用,因为这不会影响系统性能。
我希望上面的JS代码的Erlang版看起来像
my_fun(Arg1, Arg2) ->
case Arg1 + Arg2 of
Sum when Sum > ?TOO_HIGH ->
too_high;
Sum ->
other_fun(Sum, Arg1)
end.
没有回调,因为函数返回值(too_high
和{ok, Result}
)。所有功能都是阻塞的 - 如果other_fun
是网络呼叫,它可能会在返回前等待几秒钟。如果需要并行性,您spawn
可以使用任意数量的进程。