在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用户组中发起讨论。这在熟悉范式的开发人员中是一个非常常见的问题。我希望文档能得到改进。
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$
单播示例:
// 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)
}
使用旧枚举数的替代方法。命令是使用generateM:
val out = Enumerator.generateM[JsValue] {
Promise.timeout( {
Some(Json.obj("data" -> 12345))
}, 100, TimeUnit.MILLISECONDS )
}
在这里,我们使用超时生成一个重复的值。这个枚举数永远重复,尽管generateM允许您返回None来指示何时完成。