模式简介
Promise模式是一种异步编程模式 。它使得我们可以先开始一个任务的执行,并得到一个用于获取该任务执行结果的凭据对象,而不必等待该任务执行完毕就可以继续执行其他操作。等到我们需要该任务的执行结果时,再调用凭据对象的相关方法来获取。这样就避免了不必要的等待,增加了系统的并发性。
模式架构
Promise模式中,客户端代码调用某个异步方法所得到的返回值仅是一个凭据对象(该对象被称为Promise,意为“承诺”
)。凭借该对象,客户端代码可以获取异步方法相应的真正任务的执行结果。
-
Promisor:负责对外暴露可以返回Promise对象的异步方法,并启动异步任务的执行。其主要方法及职责如下。
-
compute
:启动异步任务的执行,并返回用于获取异步任务执行结果的凭据对象。
-
-
Promise:包装异步任务处理结果的凭据对象。负责检测异步任务是否处理完毕、返回和存储异步任务处理结果。其主要方法及职责如下。
-
getResult
:获取与其所属Promise实例关联的异步任务的执行结果。 -
setResult
:设置与其所属Promise实例关联的异步任务的执行结果。 -
isDone
:检测与其所属Promise实例关联的异步任务是否执行完毕。
-
- Result:负责表示异步任务处理结果。具体类型由应用决定。
-
TaskExecutor:负责真正执行异步任务所代表的计算,并将其计算结果设置到相应的Promise实例。其主要方法及职责如下
-
run
:执行异步任务所代表的计算。
-
执行过程
获取异步任务处理结果
- 第1步:客户端代码调用Promisor的异步方法compute。
- 第2、3步:compute方法创建Promise实例作为该方法的返回值,并返回。
- 第4步:客户端代码调用其所得到的Promise对象的getResult方法来获取异步任务处理结果。如果此时异步任务执行尚未完成,则getResult方法会阻塞(即调用方代码的运行线程暂时处于阻塞状态)。
异步任务执行过程
- 第1步:Promisor的异步方法compute创建TaskExecutor实例。
- 第2步:TaskExecutor的run方法被执行(可以由专门的线程或者线程池来调用run方法)。
- 第3步:run方法创建表示其执行结果的Result实例。
- 第4、5步:run方法将其处理结果设置到相应的Promise实例上。