我正在使用PlayFramework和json lib。
我有一个非常常见的用于反序列化的用例:我需要检查数据库中是否存在id。
任何人使用Reads[Future[T]]
或者这是一个坏主意?
似乎我需要将Future[JsResult[T]]
转换为JsResult[Future[T]]
才能使用现有的组合器......
我想要的代码示例
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)))
})
你知道是否有代码样本做这种伎俩吗?
答案 0 :(得分:1)
不确定我是否正确理解了你的问题,但可以在游戏中使用期货。
您可以将操作定义为Action.async
,现在预计会Future[Result]
。您可以将您的未来映射到正确的结果并返回这样的未来。
示例:
def checkId = Action.async {
val jsResult = existenceReads(...)
jsResult map {
case JsError(error) => BadRequest
case JsSuccess(val) => Ok
}
}
类型JsResult[Future[T]]
听起来很奇怪。如果你有一些产生JsResult
的操作,如果你已经使用期货,那么你会期望它是异步的