什么';在Erlang中处理异步工作的规范方法是什么?

什么';在Erlang中处理异步工作的规范方法是什么?,erlang,Erlang,我有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, Arg

我有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代码吗?还有其他的方法吗?

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.

没有回调,因为函数返回值(
太高
,可能
{ok,Result}
)。所有函数都被阻塞——如果
other\u-fun
是网络调用,它可能会等待几秒钟再返回。如果需要并行性,您可以生成任意数量的进程。

为什么不使用不同的函数子句呢?或者
case User of
?您需要做好准备,因为如果您试图在Erlang中使用与在其他语言中相同的错误处理方法,那么您就错了。例如,尝试搜索Erlang的“让它崩溃”哲学,然后。