Начнем с того, что 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
ему не нужна не имеет большого смысла.