Как я могу использовать неправильный элемент при ошибке возврата потока реактора проекта? - PullRequest
0 голосов
/ 12 сентября 2018

Допустим, у меня есть поток, в котором элемент выдает ошибку.

 Flux.just("aeiou","aeio").map(x -> {
           if(!x.endsWith("u")){throws Exception;}
           return x;})
      .onErrorReturn(/*This only accepts a new element*/)
      .map(x -> x+";")
      .subscribe();

 Flux.just("aeiou","aeio").map(x -> {
           if(!x.endsWith("u")){throws Exception;}
           return x;})
      .onErrorResume(/*This doesn't do the next steps*/)
      .map(x -> x+";")
      .subscribe();

Я хочу что-то вроде этого

 Flux.just("aeiou","aeio").map(x -> {
           if(!x.endsWith("u")){throws Exception;}
           return x;})
      .onErrorReturn(x -> x + "u")
      .map(x -> x+";")
      .subscribe();

Документация кажется неправильной http://projectreactor.io/docs/core/release/reference/#_fallback_method

Flux.just("key1", "key2")
   .flatMap(k -> callExternalService(k)) 
   .onErrorResume(e -> getFromCache(k)); //k not resolved here

1 Ответ

0 голосов
/ 15 сентября 2018

Документация верна.

 Flux.just("key1", "key2")
   .flatMap(k -> callExternalService(k)) 
   .onErrorResume(e -> getFromCache(k)); //k not resolved here

k не разрешается, потому что k объявлено в flatMap как локальная переменная .Это не видно для onErrorResume ().Если вы объявите k над конвейером, то есть перед Flux.just, то это будет разрешено.

Во-вторых, на ваш другой вопрос

Flux.just("aeiou","aeio").map(x -> {
       if(!x.endsWith("u")){throws Exception;}
       return x;})
  .onErrorReturn(x -> x + "u")
  .map(x -> x+";")
  .subscribe();

Вы должны обратиться к документации по API.onErrorReturn () может позволить вам вернуть запасное значение.Но это запасное значение является жестко заданным, то есть вы не получите значение x там.Вы можете просто жестко закодировать значение для вас, но это может не решить вашу цель.

Я предлагаю взглянуть на onErrorResume(Function<? super Throwable,? extends Publisher<? extends T>> fallback), поскольку это позволяет вам написать функцию, в которую вы можете поместить некоторую логику для дополнительной обработки.

Это позволяет вам вернуть издателя, чтобы вы могли сделать что-то вроде ниже.

.onErrorResume(e -> { //get the value of x
                       String x = <>;// you will have to write logic to get the value of x here, as it will not be available directly                          
                       return Flux.just(x+"u");
                       })
...