【问题标题】:Adding Futures to an immutable Seq and returning it将 Futures 添加到不可变 Seq 并返回它
【发布时间】:2017-09-01 07:52:23
【问题描述】:

我觉得这并不难,但我正在努力处理 futures 并将对象或 Ints 添加到不可变的 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

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

【问题讨论】:

标签: scala playframework


【解决方案1】:

您可以使用 Future.sequence 将 List[Future[A]] 转换为 Future[List[A]] 并作为结果返回。首先,不要使用定义了copy变量的steps.foreach,而是使用steps.mapprocessTemplateDTO.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))
}

【讨论】:

    猜你喜欢
    • 2012-01-07
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2015-06-01
    相关资源
    最近更新 更多