scala将对象添加到Seq [Future [Model]]并等到完成返回

时间:2018-04-06 12:25:16

标签: scala playframework

嗨,在我的scala应用程序中,我想将Seq [Model]返回到我的前端。

def getContentComponentUsageSearch: Action[AnyContent] = Action.async { implicit request =>
    println(request.body.asJson)
    request.body.asJson.map(_.validate[StepIds] match {
      case JsSuccess(stepIds, _) =>

        println("VALIDE SUCCESS -------------------------------")

        var templates: Seq[Future[Option[ProcessTemplatesModel]]] = Future.sequence(stepIds.s.map(s => {
          processTemplateDTO.getProcessStepTemplate(s.processStep_id).flatMap(stepTemplate => {
            templates :+ processTemplateDTO.getProcessTemplate(stepTemplate.get.processTemplate_id.get)
          })
        }))

        templates.map(done => {
          Future.sequence(templates).map(a => {
            Ok(Json.obj("id" -> a))
          })
        })




      case JsError(_) =>
        println("NOT VALID -------------------------------")
        Future.successful(BadRequest("Process Template not create client"))
      case _ => Future.successful(BadRequest("Process Template create client"))
    }).getOrElse(Future.successful(BadRequest("Process Template create client")))
  }

我需要等到它完成然后返回。什么是实现这一目标的好方法?

提前感谢。

更新:

此刻我尝试了这个:

 val fList: List[Future[ProcessTemplatesModel]] +: stepIds.s.map(s => {
             processTemplateDTO.getProcessStepTemplate(s.processStep_id).map(stepTemplate => {
              processTemplateDTO.getProcessTemplate(stepTemplate.get.processTemplate_id.get).map(a => {
                a.get
              })
            })
          })

        Future.successful( Ok(Json.obj("id" -> fList)))

在这种情况下的问题是我认为的+:

1 个答案:

答案 0 :(得分:1)

我认为你只需重写这部分:

templates.map(done => {
          Future.sequence(templates).map(a => {
            Ok(Json.obj("id" -> a))
          })
        })

如果您愿意这样做:

val futSeqOpt: Future[Seq[Option[ProcessTemplatesModel]]] = Future.sequence(templates)
val futSeq: Future[Seq[ProcessTemplatesModel]] = futSeqOpt.map(_.getOrElse("defaultValue"))

futSeq.map(seq => Ok(Json.toJson(seq)))

它应该有用。 (我只添加了演示类型。)