1

サーバーと通信する 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 のベスト プラクティスに限定して回答してください。

4

1 に答える 1

1

あなたが欲しいと思うのは、いくつかのノードスタイルのイベントです。ただし、API をどのように設計および構造化するかは、通常、ユーザー次第です。

Node.js は EventEmitter クラスでイベントを処理します。これらのクラスには、特定のイベント (文字列として定義されているだけ) と、各イベントの一連のリスナー (これらは単なる関数) があります。これらのイベントはメソッドによって起動され、メソッドemitによって関連付けられonます。フックするものを定義するだけです。EventEmitter を使用して、そのようなクラスを 1 つ定義しましょう。

{ EventEmitter } = require 'events'

class TurkEmitter extends EventEmitter

module.exports = new TurkEmitter

開発者は、このクラスを次のように使用します。

TurkEmitter = require 'TurkEmitter' # Whatever path

TurkEmitter.on 'connect', (event) ->
    doSomething(with: event)

TurkEmitter の'connect'イベントにフックしただけで、そのイベントが発生するたびに関数が呼び出されます。開発者は、そのイベントに複数のリスナーをアタッチしたり、リスナーを削除したりできます。

コードのどこかで、次のようにこのイベントを発生させますemit

TurkEmitter.emit 'connect', { some: 'object here' } # Any object that the developer will use

クライアントで実行されるコードと、サーバーで実行されるコードが書かれているようです。その場合、クライアント側の EventEmitter の単純なポートを作成する必要があります。

于 2013-02-24T00:34:17.317 に答える