如何处理阅读[未来[A]]

时间:2016-04-04 20:33:19

标签: scala playframework

我正在使用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)))
  })

你知道是否有代码样本做这种伎俩吗?

1 个答案:

答案 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的操作,如果你已经使用期货,那么你会期望它是异步的