2017-09-01 18 views
-2

我覺得這並不困難,但我正在努力與futures並將對象或Int s添加到不可變的Seq將期貨添加到不可變的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

任何想法?提前致謝!

+0

請先看看[documentation](http://docs.scala-lang.org/overviews/collections/overview.html),試試看 – cchantep

回答

0

您可以使用Future.sequence將List[Future[A]]轉換爲Future[List[A]]並作爲結果返回。首先,請不要使用steps.foreachcopy變量定義,而是使用steps.mapprocessTemplateDTO.createCopyOfStepTemplates得到ProcessTemplateModel,並且地圖將返回未來結果列表 - 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)) 
}