【问题标题】:Scala future for comprehension with another future in yieldScala 未来的理解与产量的另一个未来
【发布时间】:2015-03-25 17:02:37
【问题描述】:

我有这个代码:

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)
}

什么是最好的解决方案?还有其他解决办法吗?

提前谢谢你!!

【问题讨论】:

    标签: scala future


    【解决方案1】:

    只需再添加一个阶段即可:

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

    【讨论】:

    • 非常感谢,我会使用这个解决方案。其他问题:我的第二个解决方案(使用等待)是否阻塞?或者它不会阻塞,因为等待是在另一个未来中。
    • @jfabaf 它会阻塞直到f1f2f3 准备就绪,但不会阻塞service.getFutureR100()service.getFutureR200()
    【解决方案2】:

    为什么不在理解中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,你在某种程度上是在阻止。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多