当您需要查询多个异步资源并在一次操作中全部使用它们时的VertX示例:
Future<HttpServer> httpServerFuture = Future.future();
httpServer.listen(httpServerFuture.completer());
Future<NetServer> netServerFuture = Future.future();
netServer.listen(netServerFuture.completer());
CompositeFuture.all(httpServerFuture, netServerFuture).setHandler(ar -> {
if (ar.succeeded()) {
// All servers started
} else {
// At least one server failed
}
});
我们需要查询两个不同的数据库,然后在业务逻辑中使用结果,但流程是等效的。
VertX / RxJava的等价物是什么?
目前人们通过在每次需要新变量时嵌套一个新的.flatMap()调用来做到这一点。我觉得必须有更好的方法......
我们实际上并不需要查询是并发的,但我们需要缓存两个结果并同时将它们传递给业务逻辑。
答案 0 :(得分:0)
有很多方法可以做到这一点,但我试图选择一种与您的样本密切相关的方法:
@Override
public void start(Future<Void> startFuture) throws Exception {
final HttpServer httpServer = vertx.createHttpServer();
final Completable initializeHttpServer = httpServer.rxListen().toCompletable();
final NetServer netServer = vertx.createNetServer();
final Completable initializeNetServer = netServer.rxListen().toCompletable();
initializeHttpServer.andThen(initializeNetServer)
.subscribe(
() -> { /* All servers started */ },
error -> { /* At least one server failed */ }
);
}
rxListen()
次调用转换为Completable
个实例,然后在订阅时按顺序运行。
onComplete
回调,或者...... onError
回调(另外,fwiw,“嵌套”flatMap
操作对于一些微不足道的操作不应该是必要的。但是“链接”此类操作将是习惯用法。)
<强> - UPDATE - 强>
更仔细地阅读了这个问题,我现在看到你实际上在询问如何处理两个离散异步操作的结果。
替代flatMap
组合结果的方法是使用zip
运算符,如下所示:
@Override
public void start(Future<Void> startFuture) throws Exception {
final Single<String> dbQuery1 = Single.fromCallable(() -> { return "db-query-result-1"; });
final Single<String> dbQuery2 = Single.fromCallable(() -> { return "db-query-result-2"; });
Single.zip(dbQuery1, dbQuery2, (result1, result2) -> {
// handle the results from both db queries
// (with Pair being a standard tuple-like class)
return new Pair(result1, result2);
})
.subscribe(
pair -> {
// handle the results
},
error -> {
// something went wrong
}
);
}
根据docs,zip
允许您指定一系列反应类型(Single
,Observable
等)以及转换所有结果的函数曾经,其核心思想是,在所有来源发出一次(或更多,取决于反应类型)之前,它不会发出任何东西。