如何实现Vert.x AsyncResult的组合 ?

问题描述 投票:0回答:1

在执行可能失败或成功的操作时,我一直在使用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)这种方法对吗?还是可以用更简单/更好的方式完成?

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

我正在使用Vert.x 3.6.3

vert.x
1个回答
0
投票

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

Using Vert.x Future

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

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*/)

Using Vert.x with RxJava 2

如果你使用带有RxJava 2的Vert.x,你可以使用combinators合并所有Single,然后用aggregators组合最终结果


选择取决于你,无论如何我建议你看一下使用RxJava 2的Vert.x.RxJava 2运算符可以很好地处理Vert.x异步操作并允许你轻松解决这些问题

© www.soinside.com 2019 - 2024. All rights reserved.