2013-01-03 37 views
5

在我的播放2.0.4程序我有这样一段代码:PlayFramework的2.0.x - > 2.1-RC迁移

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中没有更多的信息.​​.....有人知道该怎么做吗?

UPDATE:

开始在游戏框架用户组的讨论。结果是开发人员之间的一个相当普遍的问题,他们对这种范式非常了解。希望文档能够得到改进。

+0

我认为play framework 2。*。*不擅长文档,我们将它与1.x.x版本进行比较。 –

回答

3

Concurrent.unicast的API是:

unicast[E](onStart: (Channel[E]) ⇒ Unit, onComplete: ⇒ Unit, onError: (String, Input[E]) ⇒ Unit): Enumerator[E] 

Concurrent.broadcast的API是:中

http://localhost:9000/@documentation/api/scala/index.html#play.api.libs.iteratee.Concurrent$ 
+2

是的,我在网站上看到了这个。太糟糕了,它并没有在我得到Channel [E]或Enumerator [E]的地方说什么,也没有真正解释它是如何工作的。实际上,当我在API页面时,只有这两个签名。但是,这并不比Eclipse默认提供的自动完成建议更有帮助。我只是想说明一些解释是值得的。 – noncom

+0

'broadcast'用'Enumerator [E]'和'Channel [E]'返回一个元组。这不是你需要的吗? –

+1

哈哈,打电话给我你想要什么,但我对这种API是全新的,所以我只想要一个好的文本解释,而不是签名。无论如何,Play Framework用户组已经有一个关于这个的话题......原来很多人都是这个领域的新手。 – noncom

0

例子:

broadcast[E]: (Enumerator[E], Channel[E]) 

你可以得到的API在您的应用程序使用单播:

// 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来指示何时完成。