将Futures添加到不可变的Seq并返回它

时间:2017-09-01 07:52:23

标签: scala playframework

我觉得这并不困难,但我正在努力使用futures并将对象或Int添加到不可变Seq

 def createCopyOfProcessTemplate(processTemplateId: Int): Action[AnyContent] = Action.async {
    //val copies = Seq()

    processTemplateDTO.createCopyOfProcessTemplate(processTemplateId).flatMap { process =>
      processTemplateDTO.getProcessStepTemplates(processTemplateId).map { steps =>
        steps.foreach(processStep =>
          copy: Future[Option[ProcessTemplateModel] = processTemplateDTO.createCopyOfStepTemplates(processTemplateId, process.get.id.get, processStep))
          //Seq should look something like this: [{processStep.id, copy.id},{processStep.id, copy.id},...] or [[processStep.id, copy.id],[processStep.id, copy.id],...]
      }

    Ok(Json.obj("copies" -> copies))
}

我必须在哪里定义seq以及如何处理Futures

有什么想法吗?提前致谢!

1 个答案:

答案 0 :(得分:0)

您可以使用Future.sequence将List[Future[A]]转换为Future[List[A]]并返回结果。首先,不要使用steps.foreach定义copy变量,而是使用steps.mapProcessTemplateModel获取processTemplateDTO.createCopyOfStepTemplates,map将返回未来结果列表 - List[Future[Option[ProcessTemplateModel]]。然后你可以用Future.sequence转换结果,最后作为Json对象返回。

val copies:List[Future[Option[ProcessTemplateModel]] = processTemplateDTO.createCopyOfProcessTemplate(processTemplateId).flatMap { 
process =>processTemplateDTO.getProcessStepTemplates(processTemplateId).map { steps =>
    steps.map(processStep =>
      processTemplateDTO.createCopyOfStepTemplates(processTemplateId, process.get.id.get, processStep))
}
Future.sequence(copies).map{ result =>
    Ok(Json.obj("copies" -> result))
}