PlayFramework 2.0.x - > 2.1-RC迁移

时间:2013-01-03 15:01:15

标签: playframework playframework-2.0 playframework-2.1

在我的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用户组中开始讨论。事实证明,对于那些了解范式的开发人员来说,这是一个非常普遍的问题。希望文档能够得到改进。

2 个答案:

答案 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以指示何时完成。