2017-07-04 39 views
0

可以说我有这种方法的游戏控制器 -前/后面添加场上的一个源流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异步分块处理在中间,然后在结尾处发出“]”。

+1

您可以轻松地CONCAT块的来源 – cchantep

+0

@ cchantep啊对,我可以在流源代码级别上执行它,如果我将Person源映射到Source [String],然后使用Source.concat(next)。谢谢我会发布一个完整的解决方案,如果我得到它的工作。 –

回答

1

发现的解决方案由于@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("[", ",", "]"))