scala Playframework删除未来并分配它
scala Playframework removing future and assign it
我对以下代码片段有疑问
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]]
如何删除 Future?谢谢
除非您等待 Future 在处理管道中最终完成,否则无法摆脱 Future。
使用 map 和 flatMap 或 for-comprehension 转换 Future。
假设您有 def foo: Future[A]
并且您想要 B
改变未来
foo.map(toB)
现在您将获得Future[B]
。但是如果没有 future 完成执行,就无法获得 B
值。
不等待,摆脱 Future 的唯一方法是等待它完成,但 return 类型将是 Unit。
futureComputation.onComplete {
case Success(_) =>
case Failure(_) =>
}
不好的做法
import scala.concurrrent.duration._
Try(Await.result(prerequisiteFuture, 10.seconds)).toOption
更多信息:
您不能只删除 Future,因为 Future 抽象了可能尚未计算的值。正如我从您的代码中看到的那样,您正在尝试通过映射期货来初始化 step 的可变字段。这绝对是错误的。
试着用这个来理解:
val combinedFuture = for {
v1 <- methodReturningFuture1
v2 <- methodReturningFuture2
v3 <- methodReturningFuture3
} yield (v1,v2,v3)
我现在有一个可行的解决方案:
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
})
})
我对以下代码片段有疑问
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]]
如何删除 Future?谢谢
除非您等待 Future 在处理管道中最终完成,否则无法摆脱 Future。
使用 map 和 flatMap 或 for-comprehension 转换 Future。
假设您有 def foo: Future[A]
并且您想要 B
改变未来
foo.map(toB)
现在您将获得Future[B]
。但是如果没有 future 完成执行,就无法获得 B
值。
不等待,摆脱 Future 的唯一方法是等待它完成,但 return 类型将是 Unit。
futureComputation.onComplete {
case Success(_) =>
case Failure(_) =>
}
不好的做法
import scala.concurrrent.duration._
Try(Await.result(prerequisiteFuture, 10.seconds)).toOption
更多信息:
您不能只删除 Future,因为 Future 抽象了可能尚未计算的值。正如我从您的代码中看到的那样,您正在尝试通过映射期货来初始化 step 的可变字段。这绝对是错误的。
试着用这个来理解:
val combinedFuture = for {
v1 <- methodReturningFuture1
v2 <- methodReturningFuture2
v3 <- methodReturningFuture3
} yield (v1,v2,v3)
我现在有一个可行的解决方案:
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
})
})