斯卡拉未来的理解与另一个未来的收益率

时间:2015-03-25 08:57:03

标签: scala future

我有这段代码:

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 [Long]。 当然,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)
}

什么是最佳解决方案?还有其他解决方案吗?

提前谢谢!!

2 个答案:

答案 0 :(得分:5)

只需再添加一个舞台:

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

答案 1 :(得分:0)

为什么不在for-comprehension中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