Vert.x กับ RxJava

Aug 22 2020

ในโครงการปัจจุบันของฉัน Vert.x ใช้กับ RxJava และฉันไม่เข้าใจว่าทำไม?

RxJava นำเสนออะไรนอกเหนือจากข้อเสนอของ Vert.x

มีสิ่งนี้แต่ไม่ตอบคำถามของฉัน

คำตอบ

4 dano Aug 22 2020 at 07:02

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 กำลังจะเพิ่ม Future-based API ไปยัง core Vert.x ซึ่งจะช่วยลดความต้องการ RxJava สำหรับเวิร์กโฟลว์ที่ง่ายขึ้น (เช่นตัวอย่างด้านบน) แต่โฟลว์ที่ซับซ้อนมากขึ้นจะยังคงได้รับประโยชน์จากมัน