cescoffier / vertx-completable-future

An implementation of CompletableFuture for Vert.x
Apache License 2.0
78 stars 28 forks source link

`.toFuture()` only hooks the callbacks up in one direction #37

Closed abonander closed 5 years ago

abonander commented 5 years ago

I'm trying to get a completable future out of a vertx-web-client call:

WebClient.create(vertx)
    .postAbs("http://example.com/post-path")
    .sendJsonObject(request, res -> {...});

The solution that was obvious to me was to create a pending VertxCompletableFuture and call .toFuture() on it (since the Vert.x's Future implements Handler):

var responseFuture = new VertxCompletableFuture<HttpResponse<Buffer>>(vertx);

WebClient.create(vertx)
    .postAbs("http://example.com/post-path")
    .sendJsonObject(request, responseFuture.toFuture());

var response = await(responseFuture);

However, responseFuture will never be completed because .toFuture() hooks up the callbacks in the VertxCompletableFuture -> Future direction only: https://github.com/cescoffier/vertx-completable-future/blob/master/src/main/java/me/escoffier/vertx/completablefuture/VertxCompletableFuture.java#L546

The fix is to create a Future first and use VertxCompletableFuture.from() but it's an extra step:

var responseFuture = Future.<HttpResponse<Buffer>>future();

WebClient.create(vertx)
    .postAbs("http://example.com/post-path")
    .sendJsonObject(request, responseFuture);

var response = await(VertxCompletableFuture.from(vertx, responseFuture));