PlayFramework 2.0.x -> 2.1-RC 迁移



在Play 2.0.4的程序中,我有这样一段代码:

val channel = Enumerator.imperative[JsValue](onStart = self ! NotifyJoin(username))

,现在它说imperative已弃用,API说我应该使用unicastbroadcast。我倾向于使用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来指示何时完成。

最新更新