我想创建一个类似于以下的功能。基本上这个函数,比如说F
会创建Future
说fut1
。当fut1
结算后,另一个Future
说fut2
应该在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]]
})
}
答案 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
}