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

时间:2016-08-08 05:53:04

标签: 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, Arg2, SuccessCB, FailCB) ->
  case Arg1 + Arg2 of
    Sum when Sum > ?TOO_HIGH ->
      FailCB(too_high);
    Sum ->
      other_fun(Sum, Arg1, SuccessCB, FailCB)
  end.

根据我的经验,我发现这种方法是合理的,但我觉得我需要在我的代码中做很多这样的事情,所以,显然,有一种更好的方法来管理这些真/假/无论什么情况。

这是典型的Erlang代码吗?还有其他方法我应该这样做吗?

1 个答案:

答案 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可以使用任意数量的进程。