Преобразование моно в случае успеха операции - PullRequest
0 голосов
/ 03 июня 2019

Я имею дело с клиентом Cloudfoundry Java для следующего варианта использования:

  • Я выполняю запрос, который возвращает Mono<Void>
  • В случае успеха этого Mono я хочу выполнить дополнительную операцию, которая возвращает Mono<String>
  • Для решения, когда выполнять вторую операцию, я использую filter, но, похоже, она не работает

Итак, это выглядит так:

Mono<Void> service = createService();
Mono<String> serviceKey =  service.filter( x -> someBoolean)
   .map( x -> someKey)
   .flatMap(key ->  {
       Mono<String> key = serviceKey(key);
       return key;
     });

serviceKey.blockOptional() //returns Empty

Я ожидал бы, что когда service завершится успешно и операция filter будет успешной, произойдет второй вызов serviceKey. Однако с отладчиком я увидел, что код внутри flatMap никогда не выполняется. javadoc для Mono#filter состояний:

Если значение Mono оценено, проверьте результат и воспроизведите его, если предикат вернет true. В противном случае завершить без значения.

Не уверен, как это понимать ... Вопрос в том, как я могу связать успешные операции, когда первая возвращает Mono<Void>? Я просто хочу выполнить второй, если первый успешен, и вернуть пустой Mono, когда фильтр не работает.

1 Ответ

1 голос
/ 03 июня 2019

Mono<Void> означает «Будет завершено без значения или ошибки», потому что вы не можете создать экземпляр типа Void.

Вам нужен оператор then, он игнорирует предыдущий результат и «переключает» поток на предоставленный Mono.
Существует также thenMany на случай, если вам необходимо «переключиться»это к Flux.

...