Разница между Mono.then и Mono.flatMap / map

Скажем, я хочу вызвать webservice1, а затем вызвать webservice2, если первый был успешным.

Я могу сделать следующее (только ориентировочный псевдокод): -

Mono.just(reqObj)
.flatMap(r -> callServiceA())
.then(() -> callServiceB())

or

Mono.just(reqObj)
.flatMap(r -> callServiceA())
.flatMap(f -> callServiceB())

В чем разница между ними при использовании mono.just () для одного элемента?


person Jerald Baker    schedule 12.07.2020    source источник
comment
Отвечает ли это на ваш вопрос? Следует ли мне использовать then или flatMap для потока управления?   -  person daniu    schedule 12.07.2020


Ответы (2)


flatMap следует использовать для неблокирующих операций или, короче, для всего, что возвращает Mono, Flux.

map следует использовать, если вы хотите выполнить преобразование объекта / данных за фиксированное время. Операции, выполняемые синхронно.

Например:

return Mono.just(Person("name", "age:12"))
    .map { person ->
        EnhancedPerson(person, "id-set", "savedInDb")
    }.flatMap { person ->
        reactiveMongoDb.save(person)
    }

then следует использовать, если вы хотите игнорировать элемент из предыдущего Mono и хотите, чтобы поток был завершен

person Liquidpie    schedule 13.07.2020
comment
кроме того, поскольку then действует на сигнал onComplete, он работает, в том числе, если источник пуст (как в Flux.empty()), тогда как map и flatMap запускаются только при наличии сигнала onNext. - person Simon Baslé; 13.07.2020

Вот подробное объяснение от @MuratOzkan

Скопируйте вставку ответа TL DR:

Если вам важен результат предыдущего вычисления, вы можете использовать map (), flatMap () или другой вариант карты. В противном случае, если вы просто хотите, чтобы предыдущий поток закончился, используйте then ().

В вашем примере похоже, что ваши служебные вызовы не требуют ввода восходящего потока, тогда вы можете использовать это вместо этого:

Mono.just(reqObj)
.then(() -> callServiceA())
.then(() -> callServiceB())
person Codigo Morsa    schedule 12.07.2020