在我当前的项目中,Vert.x与RxJava一起使用,我不明白为什么?
RxJava除了提供Vert.x之外还提供了什么。
有这个,但它不能回答我的问题。
核心Vert.x API使用回调来处理异步操作,这些操作可能很难组合(连锁在一起(。例如,使用回调按顺序部署一堆Verticles如下所示:
vertx.deployVerticle(MyClass1.class.getCanonicalName(), result1 -> {
if (result2.succeeded()) {
vertx.deployVerticle(MyClass2.class.getCanonicalName(), result2 -> {
if (result2.suceeded()) {
vertx.deployVerticle(MyClass3.class.getCanonicalName(), result3 -> {
if (result3.succeeded()) {
System.out.println("Deployed the verticles");
} else {
System.err.println("Failed to deploy verticle " + result3.cause());
}
});
} else {
System.err.println("Failed to deploy verticle " + result2.cause());
}
});
} else {
System.out.println("Failed to deploy verticle " + result1.cause());
}
);
使用Rximied Vert.x API的等效代码如下:
vertx.rxDeployVerticle(MyClass1.class.getCanonicalName())
.flatMap(ign -> vertx.rxDeployVerticle(MyClass2.class.getCanonicalName()))
.flatMap(ign -> vertx.rxDeployVerticle(MyClass3.class.getCanonicalName()))
.subscribe(
ign -> System.out.println("Deployed the verticles"),
err -> System.err.println("Failed to deploy verticle " + err)
);
RxJava使更容易处理这样的异步操作。当然,这个例子有点做作(你肯定可以清理回调版本,使其更可读(,但它让你知道用RxJava链接操作有多简单。RxJava有一组非常丰富的运算符,用于组合和转换异步操作,这允许您用很少的代码来表达复杂的逻辑。使用核心Vert.x API是不可能做到这一点的。
Vert.x 4.0将在核心Vert.x中添加一个基于未来的API,这将减少对RxJava的需求,以实现更简单的工作流(如上面的示例(,但更复杂的流仍将从中受益