如何实现Vert.xAsyncResult<T>的合成?

How to achieve composing of Vert.x AsyncResult<T>?

在执行可能失败或成功的操作时,我一直在使用 Handler<AsyncResult<T>> 以便在准备好时可以异步传递结果。

例如,操作可能类似于将条目添加到缓存中,如下所示

public void putEnvironmentVariable(String variableName, EnvVariable variable, Handler<AsyncResult<Long>> rsHandler) {
    redisClient.hset(ENV_CACHE, variableName, Json.encode(variable), rsHandler);
  }

在上面的示例中,我使用 Vert.x-redis 添加条目到集合中。

现在,如果要将多个条目添加到缓存中也必须执行相同的操作,我将按照下面提到的方式进行操作

list.forEach(envVariable -> {
        redisUtils.putEnvironmentVariable(envVariable.getName(), envVariable, result -> {

        });
      });

问题:

1) 这种做法对吗?还是可以用 simpler/better 的方式来完成?

2) 这里我举了一个例子,但是一般来说,如果需要执行上面提到的一些操作,并且所有操作的结果组合起来传递给调用方法,那如何实现呢? vert.x?

我正在使用 Vert.x3.6.3

当你必须执行多个异步操作并将它们的结果合并为一个结果时,你有两种选择:

使用Vert.x未来

您将 redisClient.hset() 异步结果包装在 Vert.x Future 中,然后使用 Vert.x CompositeFuture:[= 加入所有异步操作15=]

Future<Long> fut = Future.future();
redisClient.hset(ENV_CACHE, variableName, Json.encode(variable), fut);

然后当你有一个所有期货的列表时,你可以使用 CompositeFuture:

CompositeFuture
  .all(futuresList)
  .map(cf -> /*aggregate all results in one single result*/)

在 RxJava 2 中使用 Vert.x

如果您使用 Vert.x 和 RxJava 2, you can merge all Single using combinators and then compose the final result with aggregators


选择取决于你,无论如何我建议你看看 Vert.x with RxJava 2。RxJava 2 运算符与 Vert.x 异步操作配合得很好,可以让你轻松解决诸如这些