Почему Future расширяет Handler <AsyncResult>в Vertx? - PullRequest
0 голосов
/ 30 апреля 2020

Для меня Future<T> - это действие, которое в конечном итоге вернет T, или поставщика объекта типа T, тогда как Handler<AsyncResult<T>> - это обработчик, который должен будет что-то сделать с результатом T, или потребитель объекта типа T. Почему Future<T> расширяет Handler<AsyncResult<T>>?

Во многих функциях у нас есть сигнатура типа EventBus::request(String address, Object message, Handler<AsyncResult<Message<T>>> replyHandler), но мы не можем передать Future в эту функцию, можем ли мы

1 Ответ

0 голосов
/ 02 мая 2020

Начнем с того, что Future является реализацией шаблона проектирования Deferred Value, такого же, как обещания JavaScript, Deferred Kotlin и многих других.

Чтобы получить результат значения Deferred, у вас часто есть два варианта: предоставить обратный вызов или заблокировать текущий поток выполнения и подождать, пока значение Deferred либо возвратит результат, либо исключение.

Поскольку Vert.x, так же как и JavaScript runtime, работает с ограниченным числом потоков, он решил не предоставлять API блокировки. Так что единственный способ «развернуть» будущее - это предоставить ему обратный вызов. И все, что обеспечивает обратный вызов Handler в Vert.x. Возможно, это не лучшее имя, и что-то вроде CallbackReceiver было бы лучше. Но это то, что у нас есть.

Теперь давайте рассмотрим AsyncResult<T> часть. Почему будущее не может быть Handler из T? Это связано с тем, что, как я упоминал ранее, значение Deferred может возвращать результат T или исключение not-T. По этой причине мы заключаем эти два возможных значения в AsyncResult.

Относительно API EventBus - однажды в вашем блоке обратного вызова вы уже выполнили Future, поэтому передача Future ему не нужна не имеет большого смысла.

...