斯卡拉Playframework消除未来,并为其分配
问题描述:
我有下面的代码片段斯卡拉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
})
})
found : scala.concurrent.Future[Seq[models.ProcessStepPrerequisitesModel]]*
[error] required: Option[Seq[models.ProcessStepPrerequisitesModel]]
我怎样才能删除未来?谢谢
答
我现在有一个有效的解决方案:
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
})
})
答
除非您等待未来完成最终处理流程,否则无法摆脱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
答
你不能只是删除未来,因为未来的抽象化恐怕还没有计算出的值。正如我从你的代码中可以看到的那样,你试图通过映射未来初始化可变的步骤域。这绝对是错误的。
尝试使用修真此:
val combinedFuture = for {
v1 <- methodReturningFuture1
v2 <- methodReturningFuture2
v3 <- methodReturningFuture3
} yield (v1,v2,v3)
+0
我可以在'yield'中嵌套'yield'吗? – Felix
什么是processTemplateDTO.getProcessTemplates的(..)的类型? – Nyavro
类型是'未来[Seq [ProcessStepPrerequisitesModel]]' – Felix