Что тогда, thenEmpty, thenMany и flatMapMany в spring webflux?

Я не понимаю, в чем разница между then, thenEmpty, thenMany и flatMapMany на Flux или Mono в spring webflux.


person Amr Khaled    schedule 14.01.2018    source источник
comment
Я нашел ответ в документации реактора проекта projectreactor.io/ документы / ядро ​​/ выпуск / API / реактор / ядро ​​/ издатель /   -  person Amr Khaled    schedule 15.01.2018


Ответы (1)


  • flatMap против flatMapMany

В функциональном программировании flatMap возвращает тот же тип, что и тип, несущий метод, поэтому для Mono<T> flatMap возвращает Mono. Это означает, что только один элемент может быть испущен внутренним Publisher (или что он усечен). Мы добились этого, заставив Mono#flatMap взять Function<T, Mono<R>>.

Как следствие, нам нужна была альтернатива для более произвольного Publisher, которая могла бы испускать более одного элемента. Следовательно, Mono#flatMapMany(Function<T, Publisher<R>>), который возвращает Flux<R>.

TL; DR: Mono#flatMap для асинхронного, но преобразование 1 в 1 элемента в источнике Mono, Mono#flatMapMany для асинхронного преобразования 1 в N < / strong> преобразование (например, Flux # flatMap).

  • then, thenEmpty и thenMany

Все thenXXX методы на Mono имеют одну общую семантику: они игнорируют исходные onNext сигналы и реагируют на сигналы завершения (onComplete и onError), продолжая последовательность в этой точке с различными параметрами. Как следствие, это может изменить общий тип возвращаемого Mono:

  1. then просто воспроизведет сигнал терминала источника, в результате чего будет Mono<Void>, чтобы указать, что он никогда не сигнализирует onNext.
  2. thenEmpty не только возвращает Mono<Void>, но и принимает Mono<Void> в качестве параметра. Он представляет собой конкатенацию сигнала завершения источника затем второго, пустого сигнала завершения моно. Другими словами, он завершается, когда A, затем B оба завершили последовательно, и не передает данные.
  3. thenMany ожидает завершения источника, затем воспроизводит все сигналы из своего параметра Publisher<R>, в результате чего Flux<R> будет "приостанавливаться", пока источник не завершит работу, затем испускает многие элементы от предоставленного издателя, прежде чем также воспроизвести его сигнал о завершении.
person Simon Baslé    schedule 16.01.2018
comment
Я использую thenMany, чтобы идти за охранником. Это хороший образец? Т.е. охрана возвращает Mono.error(...), если предварительное условие не выполнено, Mono.empty() в противном случае. Затем у меня есть thenMany, чтобы продолжить вычисления и вернуть Flux в моем приложении webflux. - person wilmol; 24.09.2020
comment
да, это должно работать @wilmol, хотя я полагаю, что Mono.error используется внутри flatMap (который вы назвали охранником)? в этом случае было бы меньше накладных расходов, чтобы напрямую возвращать Flux в ветке else плоской карты, а не из thenMany - person Simon Baslé; 25.09.2020