サーバーと通信する Comet 実装 (CometD) 上の薄いレイヤーである Javascript ライブラリ (Coffeescript で) を作成しています。基本的に、次の 2 種類の事象が発生します。
- 一部のクライアント側の Javascript コードが呼び出さ
library.someAction()
れ、アクションがサーバーに送信されます。 - 一部のイベントは非同期で発生
library
し、このイベントをクライアント側のコードに通知する必要があります。
現在の実装のコードは次のとおりです。
https://github.com/HarvardEconCS/TurkServer/blob/master/turkserver-js-client/src/tsclient.coffee
Javascript に変換された同じコード: http://pastebin.com/w4ABf1vd
クライアントが開始するアクションの場合、アクションの種類ごとにライブラリに関数があります。たとえば、クライアントがクイズの結果をサーバーに送信する必要がある場合があるため、次の対応する関数があります。
@sendQuizResults: (correct, total) =>
@channelSend "/service/user",
status: Codec.quizResults
correct: correct
total: total
サーバーによって開始されるイベントの場合、クライアント側のコードはイベントの種類ごとにコールバックを登録する必要があるため、コールバックの山が山積みになり、それぞれを設定する関数が存在します。つまり、次の膨大な数があります。
@requestUsername_cb = undefined
@RequestUsername: (callback) ->
@requestUsername_cb = callback
上記の例では、RequestUsername
イベントがトリガーされた場合、クライアントは がrequestUsername_cb()
存在する場合に呼び出します。
これは混乱し始めているように見えるので、このようなライブラリを作成し、すべてのイベントとアクションを合理的な方法で整理するための良い方法があるかどうか疑問に思っていました. CS は基本的に上記のすべての関数をクロージャにラップして、JS オブジェクトとして使用できるようにします。
私は、言語を使い始めたばかりの Javascript ユーザーの 1 人であることを認めなければなりません。その後、さまざまな理由で Coffeescript に飛びつきました。Javascript についてよくわからないことがあれば、教えていただければ幸いです。ただし、これが話題から外れたり、CS 対 JS などの炎上戦争に発展したりしたくありません。一般的なこのタイプの API のベスト プラクティスに限定して回答してください。