1

ReactiveMongo で Play フレームワークを使用しています。ReactiveMongo API のほとんどは Play に基づいていますEnumerator。MongoDB からデータを取得し、それを「そのまま」非同期で返す限り、すべて問題ありません。また、BSON を String に変換するなど、データの変換Enumerator.mapも明らかです。

しかし、今日、最終的に次のコードに絞り込まれる問題に直面しました。Enumerator指定された からアイテムを消費し、Enumeratorそれらの間にいくつかのアイテムを挿入するを作成しようとして、1日の半分を無駄にしました。一度にすべてのアイテムをロードしないことが重要です。多数のアイテムが存在する可能性があるためです (コード例には、「1」と「2」の 2 つのアイテムしかありません)。しかし、意味的にはmkStringコレクションに似ています。非常に簡単に実行できると確信していますが、私ができる最高のものはこのコードでした。Enumeratorusing を作成する非常によく似たコード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)
}
4

2 に答える 2