Разница между Mono # тогда и Mono # и? - PullRequest
2 голосов
/ 17 мая 2019

Учитывая следующие моно:

Mono<Void> mono1 = Mono.fromRunnable(() -> {
    System.out.println("sleep1");
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        throw new IllegalStateException(e);
    }
    System.out.println("mono1");
});
Mono<Void> mono2 = Mono.fromRunnable(() -> {
    System.out.println("mono2");
});
Mono<Void> mono3 = Mono.fromRunnable(() -> {
    System.out.println("mono3");
});

Оба:

mono1
        .then(mono2)
        .then(mono3)
        .block();

И

mono1
        .and(mono2)
        .and(mono3)
        .block();

имеют одинаковый вывод:

sleep
mono1
mono2
mono3

В чем разница между Mono#then и Mono#and в этом случае?


С https://projectreactor.io/docs/core/release/reference/index.html#which-operator:

[Если у вас есть последовательность, но [вас] не интересуют значения, и [вы] хотите в конце переключиться на другое моно, [используйте] Mono#then(mono).

[Если вы хотите объединить издателей, согласовав их прекращение из 1 Mono и любого источника в Mono, [используйте] Mono#and.

Это не поможет мне найти случай, когда #and и #then будут вести себя по-разному, к сожалению.

1 Ответ

1 голос
/ 17 мая 2019

Mono#and просто «объединяет сигналы завершения из текущего моно и другого источника в возвращенный моно void».Он всегда возвращает Mono<Void> и позволяет координировать завершение двух Mono с.

Mono#then позволяет связать два Mono с друг друга, и окончательный результат будет определяться переданным Monoв качестве параметра.В этом смысле Mono#then является более примитивной версией Mono#flatMap, единственное отличие состоит в том, что внутри Mono#flatMap у вас есть доступ к результату предыдущего Mono в цепочке, которую вы можете преобразовать в другую Mono instance.

Кроме того, при Mono#then операции будут выполняться последовательно, а при Mono#and нет гарантии заказа (по крайней мере, из документации).

...