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)

我知道这onComplete是在 is 时执行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,onDoneEnumerating和感到困惑Iteratee#map
有人可以解释这些差异吗?
尤其是,为什么Concurrent#broadcast不像现在那样提出onComplete论点unicast

很难找到一些关于Iteratee世界的好文档。

4

1 回答 1

2

每一个都是不同的,但差异是微妙的。

onComplete参数unicast允许您设置一个回调,用于当它应用到的 Iteratee 成功完成时。单独的onError回调用于失败时。

onDoneEnumerating方法允许您附加一个回调,如果成功完成或失败Enumerator,将调用该回调。Iteratee

Iteratee.map允许您将回调附加到Iteratee成功完成的对象,并更改它完成的值。

Concurrent.broadcast不接受onCompleteonError回调,因为它可以应用于多个Iteratee实例,这些实例的行为方式不一定相同。一个实例可能会因错误而死亡,而另一个实例稍后会成功完成,而另一个则永远不会完成。因此,运行 Enumerator 的代码对这些事件做出反应不太可能有意义。

于 2014-04-30T01:00:22.197 回答