2015-03-25 117 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