使用RxJava的Vert.x

问题描述

在我当前的项目中,Vert.x与RxJava一起使用,我不明白为什么?

在Vert.x的基础上,RxJava提供了什么。

this,但没有回答我的问题。

解决方法

核心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());
  }
);

使用Rxified 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中添加一个基于Future的API,这将减少对RxJava的需求,以简化工作流程(如上面的示例),但更复杂的流程仍然可以从中受益。 / p>