2017-10-04 91 views
1

我有下面的代码片段斯卡拉Playframework消除未来,并为其分配

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]]

我怎样才能删除未来?谢谢

+0

什么是processTemplateDTO.getProcessTemplates的(..)的类型? – Nyavro

+0

类型是'未来[Seq [ProcessStepPrerequisitesModel]]' – Felix

回答

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

除非您等待未来完成最终处理流程,否则无法摆脱Future。

使用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

+0

等待不是我期待的使用... – Felix

+0

问题不是不同步的问题...问题是错误的类型 – Felix

+0

也onComplete不是答案我的问题 – Felix

2

你不能只是删除未来,因为未来的抽象化恐怕还没有计算出的值。正如我从你的代码中可以看到的那样,你试图通过映射未来初始化可变的步骤域。这绝对是错误的。

尝试使用修真此:

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

我可以在'yield'中嵌套'yield'吗? – Felix