在我的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用户组中开始讨论。结果发现,在开发人员中,这是一个非常常见的问题,他们对这个范例很熟悉。希望文档能得到改进。
发布于 2013-01-14 03:57:29
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$
发布于 2013-04-18 14:03:39
使用Unicast的示例:
// 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以指示何时完成。
https://stackoverflow.com/questions/14141408
复制相似问题