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にも注意することをお勧めします。



All Articles