在我的Play 2.0.4程序中,我有这段代码:
val channel = Enumerator.imperative[JsValue](onStart = self ! NotifyJoin(username))
现在它说不推荐使用imperative
,API说我应该使用unicast
或broadcast
。我倾向于使用unicast
因为在我的代码中channel
是单播的。所以我做了
val channel = Concurrent.unicast[JsValue](onStart = self ! NotifyJoin(username))
但它不起作用..看起来unicast
想要别的东西。我无法弄清楚 - API中没有更多信息......有谁知道该怎么做?
更新
在Play Framework用户组中开始讨论。事实证明,对于那些了解范式的开发人员来说,这是一个非常普遍的问题。希望文档能够得到改进。
答案 0 :(得分:3)
Concurrent.unicast
的API是:
unicast[E](onStart: (Channel[E]) ⇒ Unit, onComplete: ⇒ Unit, onError: (String, Input[E]) ⇒ Unit): Enumerator[E]
Concurrent.broadcast
的API是:
broadcast[E]: (Enumerator[E], Channel[E])
您可以在以下位置访问应用中的API:
http://localhost:9000/@documentation/api/scala/index.html#play.api.libs.iteratee.Concurrent$
答案 1 :(得分:0)
使用单播的示例:
// here is an enumerator that returns a chunk to the channel
val outEnumerator = Concurrent.unicast[JsValue] { channel =>
val data = Json.obj("data" -> 12345)
channel.push(data)
}
使用旧的Enumerator.imperative的另一种方法是使用generateM:
val out = Enumerator.generateM[JsValue] {
Promise.timeout( {
Some(Json.obj("data" -> 12345))
}, 100, TimeUnit.MILLISECONDS )
}
这里,我们使用超时生成重复值。此枚举器将永远重复,尽管generateM允许您返回None以指示何时完成。