Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何处理Reads[Future[A]]_Scala_Playframework - Fatal编程技术网

Scala 如何处理Reads[Future[A]]

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

我正在使用PlayFramework和json库

对于反序列化,我有一个非常常见的用例:我需要检查DB中是否存在id

任何人使用
阅读[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反序列化到一个对象,然后检查是否可以找到它,那么测试和推理(即,单独的阶段和/或错误消息)不是更容易吗?