TameJSとは何ですか?
TameJSは、イベント/非同期プログラミングをより簡単かつエレガントにするJavascript拡張機能です。 nodejsまたは他のv8プロジェクトでの使用は非常に簡単です。
簡単な例
出会い系サイトがあり、ユーザー「Angel」がユーザーのページ「Buffy」にアクセスするユーザーのハンドラーを作成するとします。
このような訪問のアルゴリズムは次のとおりです。
- BuffyがAngelにどれだけ適合するかを計算します(共通の興味と好み)
- エンジェルの次のペアを見つける
- 訪問の記録、訪問の記録時間
- -1)アフィニティ評価が高く、2)ユーザーが互いのページにアクセスしなかった場合にのみ、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
代替案
コマンドのフローに影響する拡張機能に関心がある場合は、 StratifiedJS 、 Step 、およびSeqにも注意することをお勧めします。