code: public static VertxCompletableFuture<Void> runAsync(Context context, Runnable runnable) {
      Objects.requireNonNull(runnable);
      VertxCompletableFuture<Void> future = new VertxCompletableFuture<>(context);
      context.runOnContext(v -> {
        try {
          runnable.run();
          future.complete(null);
        } catch (Throwable e) {
          future.completeExceptionally(e);
        }
      });
      return future;
    }
docs: Returns a new CompletableFuture that is asynchronously completed by a task running in the
  current Vert.x {@link Context} after it runs the given action.
  <p>
  This method is different from {@link CompletableFuture#runAsync(Runnable)} as it does not use a fork join
  executor, but use the Vert.x context.
  
  @param context  the context
  @param runnable the action to run before completing the returned CompletableFuture
  @return the new CompletableFuture