斯卡拉未来产量
问题描述:
与另一个未来的理解我有这样的代码:斯卡拉未来产量
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)
}
什么是最好的解决办法吗?还有其他解决方案吗?
预先感谢您!
答
只需添加一个阶段为:
for {
r1 <- f1
r2 <- f2
r3 <- f3
result <- (
if (combine(r1,r2,r3)) service.getFutureR100()
else service.getFutureR200())
} yield result
答
为什么不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
非常感谢您,我将使用此解决方案。 其他问题:我的第二个解决方案(使用await)阻塞?或者它不会因为等待在另一个未来而被阻止。 – jfabaf 2015-03-25 12:50:30
@jfabaf直到'f1','f2'和'f3'准备就绪,但不会阻塞'service.getFutureR100()'或'service.getFutureR200()' – Kolmar 2015-03-25 13:22:16