scala Playframework删除未来并分配它

时间:2017-10-04 09:27:52

标签: scala playframework playframework-2.0

我遇到以下代码段的问题

val prerequisiteFuture = processStepPrerequisitesDTO.getProcessStepPrerequisiteProcessTemplateIds(step.id.get)
prerequisiteFuture.map(prereqTemplates => {
  processTemplateDTO.getProcessTemplates(prereqTemplates).map(pres => {
    step.stepPrerequisites = Some(pres)
    step.prerequisites = processStepPrerequisitesDTO.getProcessStepPrerequisitesByProcessTemplateId(step.id.get).map(preReqs => {
      preReqs
    })
    step
  })
})

问题如下: enter image description here

found : scala.concurrent.Future[Seq[models.ProcessStepPrerequisitesModel]]* [error] required: Option[Seq[models.ProcessStepPrerequisitesModel]]

如何删除未来?感谢

3 个答案:

答案 0 :(得分:5)

除非你等待未来最终完成处理管道,否则没有办法摆脱未来。

使用map和flatMap或for-comprehension转换Future。

假设您有def foo: Future[A]并且想要B

改变未来

foo.map(toB)

现在你将获得Future[B]。但是如果没有将来完成执行,就无法获得B值。

无需等待,摆脱Future的唯一方法是等待它完成,但返回类型将是Unit。

futureComputation.onComplete {
  case Success(_) =>
  case Failure(_) =>
}

不好的做法

import scala.concurrrent.duration._

Try(Await.result(prerequisiteFuture, 10.seconds)).toOption

更多信息:How risky is it to call Await.result on db calls

答案 1 :(得分:2)

你不能只删除Future因为Future抽象了可能尚未计算的值。正如我从您的代码中可以看到的那样,您正试图通过映射未来来初始化可变字段。这绝对是错误的。

尝试用于理解:

val combinedFuture = for {
  v1 <- methodReturningFuture1
  v2 <- methodReturningFuture2
  v3 <- methodReturningFuture3
} yield (v1,v2,v3)

答案 2 :(得分:0)

我现在有一个有效的解决方案:

   val prerequisiteFuture = processStepPrerequisitesDTO.getProcessStepPrerequisiteProcessTemplateIds(step.id.get)
            prerequisiteFuture.map(prereqTemplates => {
              processTemplateDTO.getProcessTemplates(prereqTemplates).map(pres => {
                step.stepPrerequisites = Some(pres)

                processStepPrerequisitesDTO.getProcessStepPrerequisitesByProcessTemplateId(step.id.get).map(b =>
                  step.prerequisites = Some(b))

                step
              })
            })