为什么 Future 在 Vertx 中扩展 Handler<AsyncResult>?

Why Future extends Handler<AsyncResult> in Vertx?

对我来说,Future<T> 是一个最终会 return T 的动作,或者是 T 类型对象的提供者,而 Handler<AsyncResult<T>> 是一个处理程序,需要对 T 的结果或类型 T 的对象的使用者执行某些操作。为什么 Future<T> 扩展 Handler<AsyncResult<T>>

在很多函数中,我们都有像 EventBus::request(String address, Object message, Handler<AsyncResult<Message<T>>> replyHandler) 这样的签名,但是我们不能将 Future 传递给这个函数,对吗?

让我们从 Future 是递延值设计模式的实现开始,与 JavaScript promises、Kotlin 的 Deferred 和许多其他模式相同。

要获得 Deferred 值的结果,通常有两种选择:通过提供回调或阻塞当前执行线程并等待 Deferred 值 return 成为结果或异常。

由于 Vert.x,与 JavaScript 运行时相同,使用有限数量的线程运行,因此选择不提供阻塞 API。因此,"unwrap" 未来的唯一方法就是为其提供回调。任何在 Vert.x 中提供调用 Handler 的回调。也许这不是最好的名字,"CallbackReceiver" 这样的名字会更好。但这就是我们所拥有的。

现在让我们来处理 AsyncResult<T> 部分。为什么 Future 不能成为 THandler?这是因为,正如我之前提到的,延迟值可以 return 结果 T 或异常,即 not-T。出于这个原因,我们将这两个可能的值包装在 AsyncResult.

关于 EventBus API - 一旦进入回调块,您就已经完成了 Future,因此将 Future 传递给它没有多大意义。