Разница между Mono.then и Mono.flatMap / map - PullRequest
0 голосов
/ 12 июля 2020

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

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

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

или

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

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

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

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 и хотите, чтобы поток был завершен

0 голосов
/ 12 июля 2020

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

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

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

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

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