我正在使用vertx-rx-java
我有一个处理程序,我需要通过PortalSettings.SSLEnabled;
PortalSettings.SSLEnforced;
PortalSettings.SSLURL;
发出2个不同的请求,并使用这2个请求的响应来创建响应。
EventBus
基本上,我需要组合两个请求结果并将其放入public handle(RoutingContext context) {
....some code...
Single<Message<Object>> firstRequest = eb.rxSend("address1", "message1");
Single<Message<Object>> secondRequest = eb.rxSend("address2", "message2");
... TODO ...
}
响应中。问题是我不完全了解如何以rxjava样式进行操作。
我唯一能想到的就是这样:
RoutingContext
但是我认为这是一个不好的方法,因为如果有10个请求而不是2个请求该怎么办?该代码将有10个嵌套调用。
是否有更好的方法来合并多个请求结果?
答案 0 :(得分:2)
zip
运算符可用于关联来自多个源的发射,区别在于它仅在其每个潜在源都发射时才发射。所以...
zip
将成对发射。 zip
将以三重态发射。要了解我的意思,您可以参考RxMarbles页面,并在观察底部流的同时处理顶部两个流的排放。
有了这种理解,您就可以使用zip运算符来合并Message
答复的结果,就像这样:
Single.zip(firstRequest, secondRequest, (firstReply, secondReply) -> {
// ...do stuff with the replies and compose some result
// to be handled in onSuccess()
return firstReply.body().toString() + secondReply.body().toString();
})
.subscribe(
result -> {
System.out.println("## onSuccess(" + result + ")");
},
error -> {
System.err.println("## onError(" + error.getMessage() + ")");
}
);
如果任一传送失败,则将触发onError
处理程序。否则将触发onSuccess
。
如果您如上所述要一次处理大量请求,则zip的重载变体可以接受Iterable
个源。在您的情况下,可能看起来像这样:
final List<Single<Message<Object>>> requests = asList(firstRequest, secondRequest, ...);
Single.zip(requests, replies -> {
// ...do stuff with the array of replies
return null;
})
.subscribe(...);
希望有帮助!