我觉得这不是那么困难,但是我正在努力 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))
}