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

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

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

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

или

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

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

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

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

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

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

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

Mono.just(reqObj)
.then(() -> callServiceA())
.then(() -> callServiceB())
Другие вопросы по тегам