如何解决另一个未来的未来

时间:2018-04-19 09:36:17

标签: scala

我想创建一个类似于以下的功能。基本上这个函数,比如说F会创建Futurefut1。当fut1结算后,另一个Futurefut2应该在fut1内创建。 fut2应该返回函数F的最终值。代码必须一直是非阻塞的。我写了类似的东西,但返回类型不是Future[Int]而是Future[Future[Int]]。我理解为什么会出现这种情况(因为map会创建Future),但我无法弄清楚如何从此代码中返回Future[Int]

import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
def fut:Future[Int] = {

  val f1 = Future{ 1 } //create a Future
   f1.map (x => {  //when f1 finishes, create another future
    println(x)
    val f2 = Future{ 2 }
     f2.map(x=> x)  //this creates another Future and thus the return is Future[Future[Int]]
    }) 
 }

2 个答案:

答案 0 :(得分:2)

使用flatMap

val f1 = Future{ 1 } //create a Future
val f2: Future[Int] = f1.flatMap(x => {
  //will be triggered only after x is ready
  Future{2}
})

答案 1 :(得分:2)

您可以使用平面地图或理解来实现这一目标。

<强> FlatMap -

def futureFunctionWithFlatMap: Future[Int] = {

val f1 = Future {
  1
}
f1.flatMap(x => {
  println(x)
  val f2 = Future {
    2
  }
  f2.map(x => x)
})
}

理解

def futureFunctionWithForComprehension: Future[Int] = {
for {
  f1 <- Future {    1     }
  f2 <- {
    println(f1)
    Future { 2  }
  }
} yield f2

}