【发布时间】:2017-03-12 21:58:35
【问题描述】:
据我所知,Future 是只读的,Promise 是一次写入数据结构。
我们需要一个Promise 来完成一个Future
例如,
object Lie extends Throwable
val lie = Future { throw Lie }
val guess = Promise[String]()
lie.onComplete { case Success(s) => guess.success("I knew it was true!")
case Failure(t) => guess.failure("I knew it was lie")}
// return type: Unit
guess.future.map(println)
// res12: scala.concurrent.Future[Unit] = List()
// I knew it was lie!
// Requires Promise to chain Future with exception
但是,我不明白为什么我们需要同时拥有 Future 和 Promise
我猜Promise 是必需的,因为Future.onComplete 签名
由于Future.onComplete 返回类型为Unit,Future 可能的异常不能被链接
我假设引入 Promise 是为了克服这个限制
但是为什么不直接更改 Future.onComplete 的签名呢?
将Future.onComplete 的返回类型更改为Future[T] 将启用Future 上的链接,但有异常
然后,Future 不需要Promise
比如上面的代码可以改成
val lie = Future { throw Lie }
lie.onComplete {
case Success(s) => "I knew it was true!"
case Failure(t) => "I knew it was lie!"
}.map(println)
//onComplete return type is Future[String]
我的问题是
1) 我说的对吗? Future 不需要Promise ,如果onComplete 签名从Unit 更改为Future[T]?
2) 为什么 Future 和 Promise 首先是分开的?
UDPATE
感谢回复者,现在我明白了 Promise 的目的。它实际上不是用于Future 链接
如果可以,我可以问你吗
为什么onComplete 返回Unit ??
它实际上可以返回Future[T] 以轻松启用链接Future
例如
Future { throw Error }.onComplete {
case Success(s) => "Success"
case Failure(t) => throw Error
}.onComplete {
case Success(s) => "Success"
case Failure(t) => throw Error
}. ...
【问题讨论】:
-
(关于您的更新);您可能想要 2.12 中新的
transform方法,请参见此处:github.com/viktorklang/blog/blob/master/…(此“博客”中的其他文章也值得一读) -
@Fabian 感谢 Fabian,这是对我最好的回答
-
不幸的是,Java 8 的作者认为我们不需要将这两个概念分开(又名
CompletableFuture)。