TameJS-非同期プログラミングの調整

TameJSとは何ですか?


TameJSは、イベント/非同期プログラミングをより簡単かつエレガントにするJavascript拡張機能です。 nodejsまたは他のv8プロジェクトでの使用は非常に簡単です。

簡単な例


出会い系サイトがあり、ユーザー「Angel」がユーザーのページ「Buffy」にアクセスするユーザーのハンドラーを作成するとします。

このような訪問のアルゴリズムは次のとおりです。


線形プログラミングでは、コードは次のようになります。
handleVisit : function(angel, buffy) { var match_score = getScore(angel, buffy); var next_match = getNextMatch(angel); var visit_info = recordVisitAndGetInfo(angel, buffy); if (match_score > 0.9 && ! visit_info.last_visit) { sendVisitorEmail(angel, buffy); } doSomeFinalThings(match_score, next_match, visit_info); } 


明確に見えますが、非同期プログラミングを使用する必要があり、コードは次のようになります。
 handleVisit : function(angel, buffy) { getScore(angel, buffy, function(match_score) { getNextMatch(angel, function(next_match) { recordVisitAndGetInfo(angel, buffy, function(visit_info) { if (match_score > 0.9 && ! visit_info.last_visit) { sendVisitorEmail(angel, buffy); } doSomeFinalThings(match_score, next_match, visit_info); }); }); }); } 


現在、コードは正しく、非同期であり、ブロッキング呼び出しは含まれていませんが、たとえば、サードパーティのプログラマーにとっては、コードの読み取りが著しく困難になっています。
また、コードでは、getScore、getNextMatch、およびrecordVisitAndGetInfoの呼び出しは互いに独立しており、並行して実行できることに注意してください。
TameJSはどのように役立ちますか?

C TameJSコードは次のようになります。
 handleVisit : function(angel, buffy) { await { getScore (angel, buffy, defer(var score)); getNextMatch (angel, buffy, defer(var next)); recordVisitAndGetInfo (angel, buffy, defer(var vinfo)); } if (score > 0.9 && ! vinfo.last_visit) { sendVisitorEmail(angel, buffy); } doSomeFinalThings(score, next, vinfo); } 

コードは明確で読みやすく、同時に完全に非同期であり、getScore、getNextMatch、およびrecordVisitAndGetInfoの並列実行により、以前の非同期バージョンよりも高速に実行されます。

あなたも私を好きでしたか?

TameJSをインストールする



Node.JSでのインストールは、npmパッケージマネージャーを介して行われます。
 npm install -g tamejs 


そして、コードで言語拡張を登録します:
 require ('tamejs').register (); // register the *.tjs suffix require ("mylib.tjs"); // then use node.js's import as normal 


以上です! さらに、Tame自体がtjsファイルをネイティブJSにコンパイルします。

TameJSの仕組み


TameJSの構文糖は、2つの共有キーワードだけで囲まれており、待機します。

 var res1, res2; await { doOneThing(defer(res1)); andAnother(defer(res2)); } thenDoSomethingWith(res1, res2); 


awaitブロックは、ネットワークとの通信やディスクの操作、タイマーなどの外部イベントを含むコードのセクションをマークします。 awaitブロックにはいくつかの遅延が含まれています。 awaitブロックは、ブロック内のすべての遅延が完了した後にのみ完了します。 defer()は、非同期呼び出しのコールバックとして使用する匿名関数を返します。 コールバック関数が引数を仮定する場合、この引数のセットをdefer()で指定します。 これらの結果は、待機ブロックの完了時に利用可能になります。

著者について


TameJSはOkCupidによって開発され、MITライセンスの下で配布されています。 githubにリポジトリがあり、プロジェクトは若く、プロジェクトにアクティビティがあります。
プロジェクトサイト-tamejs.org

代替案


コマンドのフローに影響する拡張機能に関心がある場合は、 StratifiedJSStep 、およびSeqにも注意することをお勧めします。

Source: https://habr.com/ru/post/J124795/


All Articles