前/后面添加场上的一个源流2.5
问题描述:
可以说我有这种方法的游戏控制器 -前/后面添加场上的一个源流2.5
def persons(): Action[AnyContent] =
Action { _ =>
Ok.chunked(personSource.map { p => JsObject(p) }
)
}
的阿卡源流是从人的大,但有限的流,说我们的分贝。一次将所有内容加载到内存中将导致内存不足异常。
上面的代码工作正常,我得到JSON对象的长流:
{"name": "TestPerson1}{"name": "TestPerson2"}
但现在客户端请求的响应具有以下格式:
[{"name": "TestPerson1},{"name": "TestPerson2"}]
我有麻烦找如何将前缀/后缀发送到流。也许是一个过滤器,或嵌套行动?但我发现的例子倾向于在请求上进行操作,例如重定向,或者具有副作用的操作,例如在将处理移交给内部操作之前记录某些内容。
我想在http响应开始时发出“[”,保持Source异步分块处理在中间,然后在结尾处发出“]”。
答
发现的解决方案由于@cchantep
val persons = source.map { p => JsObject(p).toString }.intersperse(",")
Action { _ =>
Ok.chunked(Source(List("[")).concat(persons).concat(Source(List("]"))))
}
或者更简单的(感谢this页,这是我之前没有发现):
Ok.chunked(source.map { p => JsObject(p).toString }.intersperse("[", ",", "]"))
您可以轻松地CONCAT块的来源 – cchantep
@ cchantep啊对,我可以在流源代码级别上执行它,如果我将Person源映射到Source [String],然后使用Source.concat(next)。谢谢我会发布一个完整的解决方案,如果我得到它的工作。 –