此代码按预期工作:
val f1 = Future {
println("start")
}.flatMap { _ =>
Future { Thread.sleep(100); "done" }
}.andThen {
case Success(x) => println(x)
}
Await.ready(f1, Duration.Inf)
输出是:
start
done
但是这段代码没有:
val f2 = Future {
println("start")
}.andThen { case Success(x) =>
Future { Thread.sleep(100); "done" }.foreach(println)
}
Await.ready(f2, Duration.Inf)
输出
start
所以我的问题是我应该如何链接一系列回调,如果这些回调也使用期货,那只会执行副作用。对我来说,我的第二个代码块似乎更多"正确"因为副作用包含在回调链的一个步骤中
答案 0 :(得分:1)
我忘了flatMap调用也可以返回一个包含Unit的Future ...
val f2 = Future {
println("start")
}.flatMap { x =>
Future { Thread.sleep(100); "done" }.map(println)
}
Await.ready(f2, Duration.Inf)