Future-Promise
介绍
Promise
是一个可以被一个值或一个异常完成的对象。并且只能完成一次,完成后就不再可变。称为单一赋值变量,如果再次赋值则会引发异常。
Promise
值的类型为Promise[T]
,可以通过其伴生对象中的Promise.apply()
创建一个实例:
def apply[T](): Promise[T]
调用该方法后会立即返回一个Promise
实例,它是非阻塞的。当新的Promise
对象被创建后,不会包含值或异常,通过success
和failure
方法分别赋值为值或异常。
通过complete
可以提供一个Try[T]
实例来填充Promise
,这时Promise
的值是一个值还是一个异常,取决于Try[T]
最终是一个包含值的Sucess
还是一个包含异常的Failure
对象。
每个Promise
对象都明确对应一个Future
对象,通过future
方法获取关联的Future
对象,并且无论调用该方法多少次,都会放回相同的Future
对象。
与success/failure/complete
对应的方法是trySuccess/tryFailure/tryCompletee
,这些方法会尝试对Promise
进行赋值并返回赋值操作是否成功的布尔值。而基本的success/failure/complete
操作返回的是则是对原Promise
的引用。
object Promise
Promise
的伴生对象,一共定义了四种构造器。
apply
def apply[T](): Promise[T] = new impl.Promise.DefaultPromise[T]()
它不接受然和参数,创建一个能够被类型为T
的值完成的Promise
对象。即创建它时只需要设置预期被完成的值的类型:
val promise: Promise[User] = Promise[User]()
fromTry
def fromTry[T](result: Try[T]): Promise[T] = new impl.Promise.KeptPromise[T](result)
提供一个Try[T]
类型的值,并返回一个被完成后的Promise
对象。这个结果Promise
中是一个值还是异常,取决于传入的Try[T]
最终是一个Success
还是一个Failure
。
failed
def failed[T](exception: Throwable): Promise[T] = fromTry(Failure(exception))
通过传入一个异常创建一个被该异常完成的Promise
对象。
successful
def successful[T](result: T): Promise[T] = fromTry(Success(result))
通过传入一个值创建一个被该值完成的Promise
对象。
trait Promise
isCompleted
判断该Promise
是否已被完成,返回一个布尔值。
complete & tryComplete
def complete(result: Try[T]): this.type =
if (tryComplete(result)) this
else throw new IllegalStateException("Promise already completed.")
def tryComplete(result: Try[T]): Boolean
tryComplete
方法尝试通过传入的Try[T]
来完成该Promise
,返回一个该操作成功失败的布尔值。需要注意的是,虽然返回的是一个布尔值,但这个布尔值表示,该 Promise 之前没有被完成并且已经被当前的操作完成,或在调用该方法之间就已经被完成。
因此,在complete
方法中,通过传入一个Try[T]
来完成一个Promise
,实际上会在内部调用tryComplete
,如果``tryComplete返回
true,表示该
Promise还没有被完成并通过这次操作成功完成,同时返回该
Promise`的引用,否则则报错已经被完成过。
completeWith & tryCompleteWith
final def completeWith(other: Future[T]): this.type = tryCompleteWith(other)
final def tryCompleteWith(other: Future[T]): this.type = {
other onComplete { this tryComplete _ }
this
}
与complete
和tryComplete
类似,不过他接收的是一个Future[T]
而不是一个Try[T]
。
success & trySuccess
def success(@deprecatedName('v) value: T): this.type = complete(Success(value))
def trySuccess(value: T): Boolean = tryComplete(Success(value))
success
方法通过一个值来完成Promise
,而trySuccess
则首先将传入的值包装为一个Success[T ]
然后调用前面的tryComplete
方法,尝试完成Promise
并返回一个布尔值。
failure & tryFailure
def failure(@deprecatedName('t) cause: Throwable): this.type = complete(Failure(cause))
def tryFailure(@deprecatedName('t) cause: Throwable): Boolean = tryComplete(Failure(cause))
与success
和trySuccess
处理过程相同,只是通过一个异常而不是一个值来完成Promise
future
def future: Future[T]
获取该Promise
对应的Future
。
总结
- 一个
Promise
有两种构造方式,构造为未完成的、构造为已完成的 - 一个
Promise
只能调用完成方法一次,无论是哪个完成方法,再次调用将抛出已完成异常 - 一个
Promise
只与一个Future
对应,无论调用多少次future
方法都会返回相同的Future
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.