据我所知,它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
as的返回类型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)为什么将“未来”和“承诺”放在首位?
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
}. ...
我对吗?也
Future
没有必要Promise
,如果onComplete
签名是从单元进行改变未来[T]?
您正在把事情混在一起。让我们澄清一下。
AFuture[T]
表示将来会完成的计算。也就是说,您传递Future.apply
了一个函数,该函数将在ExecutionContext
您定义的线程分配的线程上执行。
另一方面,现在Promise[T]
是一种创建Future[T]
而不真正创建的方法Future[T]
。一个很好的例子就是Future.successful
方法(内部使用Promise.successful
):
def successful[T](result: T): Future[T] = Promise.successful(result).future
这不需要任何ExecutionContext
队列,也不需要任何其他资源。它只是一个便利包装,使您可以“人为”创建Future[T]
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句