将期货添加到不变的SEQ中并将其返回



我觉得这不是那么困难,但是我正在努力 futures,并将对象或 Int s添加到不变的 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,我应该如何返回?

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

您可以使用Future.Sequence将List[Future[A]]转换为Future[List[A]]并结果返回。首先,请勿使用定义的copy变量使用steps.foreach,而是使用steps.map作为processTemplateDTO.createCopyOfStepTemplates结果获取ProcessTemplateModel,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))
}

最新更新