为什么我们既需要未来又需要承诺?

原平公园

据我所知,它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 


但是,我不明白为什么我们需要有两个FuturePromise

我猜Promise是因为Future.onComplete签名才需要

由于Future.onComplete返回类型为Unit,因此Future可能无法链接异常

我认为Promise是为了克服此限制而引入的


但是,为什么不只更改的签名Future.onComplete呢?

更改Future.onCompleteas的返回类型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从改变UnitFuture[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 
}. ... 
尤瓦尔·伊茨恰科夫(Yuval Itzchakov)

我对吗?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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章