2017-07-04 3 views
0

プレイでソースストリームを接尾辞を付けるが、私はこの方法でプレイコントローラーを持っているとしましょう -プリ/ 2.5

def persons(): Action[AnyContent] = 
    Action { _ => 
    Ok.chunked(personSource.map { p => JsObject(p) } 
) 
} 

アッカソースストリームはから人の大きいが有限のストリームで、私たちのDBは言います。すべてを一度にメモリにロードすると、メモリ不足の例外が発生します。

上記のコードは正常に動作し、私はJSONオブジェクトの長いストリームを取得:

{"name": "TestPerson1}{"name": "TestPerson2"} 

をしかし、今、クライアントが応答は、この形式を持って要求した:

[{"name": "TestPerson1},{"name": "TestPerson2"}] 

私が見つけトラブルを抱えていますストリームに接頭辞/接尾辞を付ける方法。たぶん、フィルタ、またはネストアクション?しかし、私が見つけた例では、リダイレクトなどのリクエストや、内部処理に処理を渡す前に何らかのログを取るなどの副作用のある操作を行う傾向があります。

私は、http応答の開始時に "["を、中間でソース非同期のチャンク処理を続け、最後に "]"を出したいと思います。

+1

することはでき簡単にチャンクのソース連結 – cchantep

+0

@ cchantepああ、人のソースをソース[文字列]にマップし、Source.concat(次へ)を使用すると、ストリームのソースレベルでそれを行うことができます。ありがとう、私はそれが動作するようになる場合、私は完全なソリューションを投稿します。 –

答えて

1

ソリューションは、(私が前に見つけることができませんでしたthisページに感謝)でも

val persons = source.map { p => JsObject(p).toString }.intersperse(",") 
Action { _ => 
    Ok.chunked(Source(List("[")).concat(persons).concat(Source(List("]")))) 
} 

それとも単純に@cchantepのおかげで見つかりました:

Ok.chunked(source.map { p => JsObject(p).toString }.intersperse("[", ",", "]"))