2

Play Framework 2.2 を使用しています

WebSocket 接続を実装するために、Concurrent.unicast自分のニーズに合った を使用します。

val enumerator = Concurrent.unicast[JsValue] {
    channel => userIdWithChannelMap += u.id -> channel
}

ただし、 のソース コードConcurrent.unicast、いくつかの引数の必要性を示しています。

def unicast[E](
    onStart: Channel[E] => Unit,
    onComplete: => Unit = (),
    onError: (String, Input[E]) => Unit = (_: String, _: Input[E]) => ())(implicit ec: ExecutionContext)

anがonCompleteのときに が実行されることを理解しています。ただし、コールバックとのメソッドの 違いは何ですか:IterateeDone
onCompletemapIteratee

/**
   *
   * Uses the provided function to transform the Iteratee's computed result when the Iteratee is done.
   *
   * @param f a function for transforming the computed result
   * $paramEcSingle
   */
  def map[B](f: A => B)(implicit ec: ExecutionContext): Iteratee[E, B] = this.flatMap(a => Done(f(a), Input.Empty))(ec)

その上、ソースコードEnumerator#onDoneEnumeratingで提示されたの必要性は何ですか。 実際、以下を扱う WebSocket の実装に出くわしました。

Concurrent.unicast{...}.onDoneEnumerating{...}

と混同していonCompleteます。 誰でも違いを説明できますか? そして特に、なぜそうであるように議論を提示しないのですか。onDoneEnumeratingIteratee#map

Concurrent#broadcastonCompleteunicast

Iteratee世界に関する優れたドキュメントを見つけるのは難しい。

4

1 に答える 1

2

これらはそれぞれ異なりますが、違いは微妙です。

onCompleteパラメーターをunicast使用すると、適用される Iteratee が正常に完了したときのコールバックをセットアップできます。別のonErrorコールバックは、失敗したときのためのものです。

onDoneEnumeratingメソッドを使用すると、が正常に完了した場合または失敗したEnumerator場合に呼び出されるコールバックをアタッチできます。Iteratee

Iteratee.mapIteratee正常に完了した にコールバックをアタッチし、完了する値を変更できます。

Concurrent.broadcast必ずしも同じように動作するとは限らない複数のインスタンスに適用できるため、onCompleteまたはコールバックを取りません。1 つのインスタンスがエラーで停止し、別のインスタンスが後で正常に完了し、別のインスタンスが完了しないことがあります。このため、Enumerator を実行しているコードがこれらのイベントに反応することはあまり意味がありません。onErrorIteratee

于 2014-04-30T01:00:22.197 に答える