Scala 为什么未来的第三个不连锁结果?
Scala 为什么未来的第三个不连锁结果?,scala,future,Scala,Future,和的意思是我从这里学到的是一个函数生成器 说 f andThen g andThen h 等于 h(g(f(x))) 这意味着h功能将从g(f(x)) 但是对于和未来中的和而言,以下和的所有闭包始终从原始未来中接收结果 Future{ 1 }.andThen{ case Success(x) => println(x) // print 1 Thread.sleep(2000) x * 2 }.andThen{ case Success(x) =>
和
的意思是我从这里学到的是一个函数生成器
说
f andThen g andThen h
等于
h(g(f(x)))
这意味着h功能将从g(f(x))
但是对于和未来中的和而言,以下和的所有闭包始终从原始未来中接收结果
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::然后从原始Future而不是链接Future收到所有相同结果的原因是什么?我已经观察到,这些链式操作将按顺序执行,因此原因可能不是出于并行目的。scala.concurrent.Future
设计为两种异步方法的折衷:
面向对象,允许绑定异步处理程序
Functional提供了丰富的功能组合功能
阅读:
将副作用函数应用于此未来结果,以及
返回一个新的未来以及该未来的结果
所以,,然后,
很可能来自OOP领域。要获得与函数1类似的结果,然后可以使用方法:
和第
与onComplete
的不同之处在于:第
和第
的结果未来仍然返回相同的结果,但将等待提供的观察者返回或抛出某个结果。这就是为什么文件中会写:
此方法允许强制回调在
指定顺序
还要注意文档中的第三行:
注意,如果其中一个链式回调和第二个回调抛出异常,
该异常不会传播到后续的第二次回调。
取而代之的是,随后的第二次回调被赋予原始值
这就是未来
因此,它对新的未来的结果完全不做任何事情。甚至不能破坏它自己的例外。这,然后和就完成了只是观察者的顺序和并行绑定。让我总结一下这场精彩的讨论
比如说,我们有两个函数,f:T=>U
和g:U=>V
我们可以做vf:Future[V]=tf图f图g
,与vf:Future[V]=tf图(f和g)
在另一个用例中,具有fp:PartialFunction[T,U]
和gp:PartialFunction[U,V]
,
我们可以运行tf1:Future[T]=tf,然后运行fp,然后运行gp
——这些部分函数将根据tf产生的值调用,没有外部影响——只会发生副作用。此序列在调用gp
之前等待fp
另一个未来操作onComplete的工作原理是这样的:使用f:Try[T]=>U
,调用tfoncomplete f
将调用f
,即使未来以错误结束;tf onComplete f
的结果属于Unit
类型
另外,如果您的函数f
生成了一个未来
,您将需要使用flatMap
我可以说它是onComplete的另一个版本,但返回“this”,以便它可以以链接方式绑定多个“observer”回调处理程序吗?@ChenOT Yes。漂亮的much@But有一点不同。我会把这个加到asnweroh哦!与onComplete返回单元不同的是,chain-able-and-then意味着这些and-then闭包将依次执行成功、失败、onComplete和and-then是绑定观察者回调函数的一组函数,这可能是一个副作用过程。还有另一组地图,flatMap,fallbackTo,recover。。。是一个未来的作曲家,将未来的结果链接并传播到尾部。我说得对吗?
Future(1).map {_ * 2}.map {_ * 2}