我从answer中学到的andThen
含义是一个函数编写器。
比如说
f andThen g andThen h
将等于
h(g(f(x)))
这意味着
h function
将接收来自g(f(x))
的输入但是对于
andThen
中的Future
,以下所有闭包andThen始终从原始Future
接收结果。Future{
1
}.andThen{ case Success(x) =>
println(x) // print 1
Thread.sleep(2000)
x * 2
}.andThen{ case Success(x) =>
println(x) // print 1
Thread.sleep(2000)
x * 2
}
相比于
val func: Function1[Int, Int] = { x: Int =>
x
}.andThen { y =>
println(y) // print 1
y * 2
}.andThen { z =>
println(z) // print 2
z * 2
}
func(1)
是什么原因使Future::andThen从原始Future中获得所有相同的结果,而不是链接Future?我观察到,这些链接的andThen将顺序执行,因此原因可能不是出于并行目的。
最佳答案
scala.concurrent.Future
设计为两种异步方法的折衷方案:
读
Future.andThen
's docs:因此
andThen
最有可能来自OOP Universe。要获得与ojit_code类似的结果,可以使用 Function1.andThen
方法:Future(1).map {_ * 2}.map {_ * 2}
map
与andThen
的不同之处在于一件事:onComplete
的Future仍返回相同的结果,但是将等待直到提供的观察者返回或抛出某些东西。这就是为什么在文档中写的原因:另请注意文档中的第三行:
因此,对新
andThen
的结果完全不执行任何操作。它自己的异常(exception)甚至无法破坏它。此Future
和andThen
只是观察者的顺序和并行绑定(bind)。