Альтернативы официальной (и некрасивой) последовательной композиции - PullRequest
0 голосов
/ 02 мая 2018

В руководствах по vertx последовательная композиция для объединения асинхронных вызовов показана ниже:

FileSystem fs = vertx.fileSystem();
Future<Void> startFuture = Future.future();

Future<Void> fut1 = Future.future();
fs.createFile("/foo", fut1.completer());

fut1.compose(v -> {
  // When the file is created (fut1), execute this:
  Future<Void> fut2 = Future.future();
  fs.writeFile("/foo", Buffer.buffer(), fut2.completer());
  return fut2;
}).compose(v -> {
          // When the file is written (fut2), execute this:
          fs.move("/foo", "/bar", startFuture.completer());
        },
        // mark startFuture it as failed if any step fails.
        startFuture);

Это только у меня так или этот код действительно громоздок и труден для чтения?

Должен быть другой путь, не попасть в ад обратного вызова. Жаль, что на vertx так мало постов в блоге, любые идеи очень ценятся.

1 Ответ

0 голосов
/ 03 мая 2018

в наши дни де-факто библиотека для написания асинхронного неблокирующего кода на JVM - RxJava . если вы не знакомы, я бы сказал, что вам стоит взглянуть, поскольку одно из многих преимуществ - это возможность записывать «потоки» в виде композиционных потоков, которые не являются такими же адскими вызовами, как JDK Future с были.

К счастью, Vert.x интегрирован с RxJava. В качестве примера, вот ваш фрагмент, переписанный с использованием артефактов RxJava:

@Override
public void start(Future<Void> startFuture) throws Exception {
    final FileSystem fs = vertx.fileSystem();

    fs.rxCreateFile("/foo")
        .andThen(fs.rxWriteFile("/foo", Buffer.buffer()))
        .andThen(fs.rxMove("/foo", "/bar"))
        .subscribe(
            () -> { 
                startFuture.complete(); 
            },
            error -> {
                startFuture.fail(error);
            }
        );
}

гораздо лаконичнее и удобочитаемее.

Примечание:

  • использовать RxJava 2, поскольку он заменен RxJava 1
  • ... однако обе версии поддерживаются в Vert.x, а их соответствующие артефакты находятся в отдельных пространствах имен:
    • io.vertx.rxjava для версии RxJava 1 артефакты
    • io.vertx.reactivex для версии RxJava 2 артефакты

надеюсь, это поможет!

...