ReactiveMongo で Play フレームワークを使用しています。ReactiveMongo API のほとんどは Play に基づいていますEnumerator
。MongoDB からデータを取得し、それを「そのまま」非同期で返す限り、すべて問題ありません。また、BSON を String に変換するなど、データの変換Enumerator.map
も明らかです。
しかし、今日、最終的に次のコードに絞り込まれる問題に直面しました。Enumerator
指定された からアイテムを消費し、Enumerator
それらの間にいくつかのアイテムを挿入するを作成しようとして、1日の半分を無駄にしました。一度にすべてのアイテムをロードしないことが重要です。多数のアイテムが存在する可能性があるためです (コード例には、「1」と「2」の 2 つのアイテムしかありません)。しかし、意味的にはmkString
コレクションに似ています。非常に簡単に実行できると確信していますが、私ができる最高のものはこのコードでした。Enumerator
using を作成する非常によく似たコードConcurrent.broadcast
は、WebSocket に役立ちます。しかし、ここでもそれは機能しません。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)
}