Scala 如何处理Reads[Future[A]]
我正在使用PlayFramework和json库 对于反序列化,我有一个非常常见的用例:我需要检查DB中是否存在id 任何人使用Scala 如何处理Reads[Future[A]],scala,playframework,Scala,Playframework,我正在使用PlayFramework和json库 对于反序列化,我有一个非常常见的用例:我需要检查DB中是否存在id 任何人使用阅读[Future[T]或者这是个坏主意 似乎我需要将Future[JsResult[T]]转换为JsResult[Future[T]]来使用现有的combinator 我想要的代码示例 def existenceReads[A](otherwise : ValidationError)(f: String => Future[Option[A]]) : Re
阅读[Future[T]
或者这是个坏主意
似乎我需要将Future[JsResult[T]]
转换为JsResult[Future[T]]
来使用现有的combinator
我想要的代码示例
def existenceReads[A](otherwise : ValidationError)(f: String => Future[Option[A]]) : Reads[Future[A]] =
Reads[Future[A]](js => StringReads.reads(js).flatMap {
v => f(v).map(_.fold(JsError(otherwise))(a => JsSuccess(a)))
})
你知道有没有这样的代码示例吗?我不确定我是否正确理解了你的问题,但可以使用未来 您可以将您的操作定义为
action.async
,现在它期望将来的[Result]
。您可以将您的未来映射到适当的结果中,并返回这样的未来
例如:
def checkId = Action.async {
val jsResult = existenceReads(...)
jsResult map {
case JsError(error) => BadRequest
case JsSuccess(val) => Ok
}
}
类型
JsResult[Future[T]
听起来很奇怪。如果您有一些生成JsResult
的操作,那么如果您已经使用了futures,那么您希望它是异步的您确定要像这样将JSON反序列化与数据库检查结合起来吗?如果您首先将JSON反序列化到一个对象,然后检查是否可以找到它,那么测试和推理(即,单独的阶段和/或错误消息)不是更容易吗?