Future-Promise

介绍

Promise是一个可以被一个值或一个异常完成的对象。并且只能完成一次,完成后就不再可变。称为单一赋值变量,如果再次赋值则会引发异常。

Promise值的类型为Promise[T],可以通过其伴生对象中的Promise.apply()创建一个实例:

def apply[T](): Promise[T]

调用该方法后会立即返回一个Promise实例,它是非阻塞的。当新的Promise对象被创建后,不会包含值或异常,通过successfailure方法分别赋值为异常

通过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
  }

completetryComplete类似,不过他接收的是一个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))

successtrySuccess处理过程相同,只是通过一个异常而不是一个值来完成Promise

future

def future: Future[T]

获取该Promise对应的Future

总结

  • 一个Promise有两种构造方式,构造为未完成的、构造为已完成的
  • 一个Promise只能调用完成方法一次,无论是哪个完成方法,再次调用将抛出已完成异常
  • 一个Promise只与一个Future对应,无论调用多少次future方法都会返回相同的Future