我使用带有 ReactiveMongo 的 Play 框架。大多数 ReactiveMongo API 都是基于 Play 的Enumerator
。只要我从 MongoDB 中获取一些数据并“按原样”异步返回,一切都很好。数据的转换,如将 BSON 转换为字符串,使用Enumerator.map
是显而易见的。
但是今天我遇到了一个问题,该问题归结为以下代码。我浪费了半天的时间试图创建一个Enumerator
消耗给定Enumerator
项目并在它们之间插入一些项目的项目。重要的是不要一次加载所有项目,因为它们可能有很多(代码示例只有两个项目“1”和“2”)。但在语义上它类似于mkString
集合。我确信它可以很容易地完成,但我能提供的最好的 - 就是这段代码。创建Enumerator
using的非常相似的代码Concurrent.broadcast
非常适合 WebSockets。但在这里,即使这样也行不通。HTTP 响应永远不会回来。当我查看时Enumeratee
,它看起来应该提供这样的功能,但我找不到解决问题的方法。
PS试图打电话chan.eofAndEnd
,Iteratee.mapDone
而chunked(enums >>> Enumerator.eof
不是chunked(enums)
- 没有帮助。有时响应会返回,但不包含正确的数据。我想念什么?
def trans(in:Enumerator[String]):Enumerator[String] = {
val (res, chan) = Concurrent.broadcast[String]
val iter = Iteratee.fold(true) { (isFirst, curr:String) =>
if (!isFirst)
chan.push("<-------->")
chan.push(curr)
false
}
in.apply(iter)
res
}
def enums:Enumerator[String] = {
val en12 = Enumerator[String]("1", "2")
trans(en12)
//en12 //if I comment the previous line and uncomment this, it prints "12" as expected
}
def enum = Action {
Ok.chunked(enums)
}