2015-03-25 95 views
1

與另一個未來的理解我有這樣的代碼:斯卡拉未來產量

def getFutureResult() : Future[Long] = { 
    val f1 = service.getFutureR1() 
    val f2 = service.getFutureR2() 
    val f3 = service.getFutureR3() 

    for { 
     r1 <- f1 
     r2 <- f2 
     r3 <- f3 
     } yield { 
     if (combine(r1,r2,r3)) 
      service.getFutureR100() 
     else 
      service.getFutureR200() 
     } 

} 

每個服務方法返回一個Future [龍]。 當然,for語句返回Future [Future [Long]],代碼不能正確編譯。 我有兩個解決方案,這是第一個:

def getFutureResult() : Future[Long] = { 
    val f1 = service.getFutureR1() 
    val f2 = service.getFutureR2() 
    val f3 = service.getFutureR3() 

    val ffresult = for { 
     r1 <- f1 
     r2 <- f2 
     r3 <- f3 
     } yield { 
     if (combine(r1,r2,r3)) 
      service.getFutureR100() 
     else 
      service.getFutureR200() 
     } 

    ffresult.flatMap(identity)  
} 

這是第二個:

def getFutureResult() : Future[Long] = { 
    val f1 = service.getFutureR1() 
    val f2 = service.getFutureR2() 
    val f3 = service.getFutureR3() 

    val ffresult = for { 
     r1 <- f1 
     r2 <- f2 
     r3 <- f3 
     } yield { 
     val fresult = if (combine(r1,r2,r3)) 
      service.getFutureR100() 
     else 
      service.getFutureR200() 
     } 
     Await.result(fresult,10 seconds) 
} 

什麼是最好的解決辦法嗎?還有其他解決方案嗎?

預先感謝您!

回答

5

只需添加一個階段爲:

for { 
    r1 <- f1 
    r2 <- f2 
    r3 <- f3 
    result <- (
     if (combine(r1,r2,r3)) service.getFutureR100() 
     else service.getFutureR200()) 
} yield result 
+0

非常感謝您,我將使用此解決方案。 其他問題:我的第二個解決方案(使用await)阻塞?或者它不會因爲等待在另一個未來而被阻止。 – jfabaf 2015-03-25 12:50:30

+0

@jfabaf直到'f1','f2'和'f3'準備就緒,但不會阻塞'service.getFutureR100()'或'service.getFutureR200()' – Kolmar 2015-03-25 13:22:16

0

爲什麼不rs的換解析裏。

val ffresult = for { 
    r1 <- service.getFutureR1() 
    r2 <- service.getFutureR2() 
    r3 <- service.getFutureR3() 
    rs <- if (combine(r1,r2,r3)) 
     service.getFutureR100() 
    else 
     service.getFutureR200() 
    } yield rs 
+0

非常感謝,我會使用此解決方案。 其他問題:我的第二個解決方案(使用await)阻塞?或者它不會因爲等待在另一個未來而被阻止。 – jfabaf 2015-03-25 12:52:38

+0

如果你「等待」,你以某種方式阻止。 – cchantep 2015-03-25 19:30:37