我使用 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 时执行Iteratee
的Done
。但是,回调和方法
之间有什么区别:onComplete
map
Iteratee
/**
*
* 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
世界的好文档。