在执行可能失败或成功的操作时,我一直在使用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
当您必须执行多个异步操作并将它们的结果合并到一个结果中时,您有两个选择:
您将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*/)
如果你使用带有RxJava 2的Vert.x,你可以使用combinators合并所有Single,然后用aggregators组合最终结果
选择取决于你,无论如何我建议你看一下使用RxJava 2的Vert.x.RxJava 2运算符可以很好地处理Vert.x异步操作并允许你轻松解决这些问题