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}