【问题标题】:scala Playframework removing future and assign itscala Playframework 删除未来并分配它
【发布时间】:2018-03-15 15:29:37
【问题描述】:

下面的代码sn-p有问题

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
  })
})

问题如下:

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

如何删除未来?谢谢

【问题讨论】:

  • processTemplateDTO.getProcessTemplates(..) 的类型是什么?
  • 类型为Future[Seq[ProcessStepPrerequisitesModel]]

标签: scala playframework playframework-2.0


【解决方案1】:

没有办法摆脱 Future 除非您等待 future 最终完成处理管道。

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

假设你有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

【讨论】:

  • 问题不是scala的异步...问题是类型错误
  • onComplete 也不是我问题的答案
  • 没有办法。您必须在进行转换时处理 Future 直到最后。
【解决方案2】:

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

尝试使用 for 理解:

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

【讨论】:

  • 我可以将for yield 嵌套在另一个for yield 中吗?
【解决方案3】:

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

   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
              })
            })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-18
    • 2018-03-15
    • 2013-03-19
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多