2016-08-08 12 views
-3

私はJavaScriptでの経験を持っていると私は、コールバック関数に使用されています:Erlangで非同期作業を処理する標準的な方法は何ですか?

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. 

を、私は私の経験から、このアプローチは、合理的な見つけ、私は感じます私のコードでこれを大量に行う必要があるように、これらの真/偽/どんなシナリオを管理するための良い方法があるようです。

この典型的なアーランコードですか?私はこれをやるべきである他の方法がありますか?

+0

異なる機能の句を使用するだけではどうですか?または 'のケースユーザー'? –

+3

Erlangでのエラー処理と同じアプローチを他の言語と同じように使用しようとすると、間違っているので、宿題をする必要があります。たとえばErlangの "墜落させよう"という哲学を探してみよう。例えば、[関連する質問がある](http://stackoverflow.com/questions/4393197/erlangs-let-it-crash-philosophy-applicable-elsewhere)。 –

答えて

0

JavaScriptは、スレッドが1つでコールバックがコンテキストスイッチを介して状態を転送する方法であるため、コールバックが使用されます。

コールバック関数は一般的に便利なツールですが、JavaScriptでは基本ツールです。これは非同期処理の仕組みであるためです。

Erlangでは、多くのプロセスを使用することができます。 1つのプロセス内で、システムのパフォーマンスに影響しないため、同期ブロッキング呼び出しを行うことができます。

私は上記の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にしてください。

関連する問題