2017-10-04 92 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