Как остановить обработку, если наблюдаемое пусто или равно нулю - PullRequest
0 голосов
/ 10 мая 2018

Я пробую rxJava. У меня есть цепочка операторов, которые обрабатывают Observable, возвращенный из службы.

Я хочу ничего не делать, когда возвращаемое Observable пусто (Observable.empty()).

Как мне этого добиться?

1 Ответ

0 голосов
/ 10 мая 2018

По самой своей природе, Observable, который не выдает значений, а затем завершает (что и делает Observable.empty()), не будет передавать значения вашему подписчику или любому последующему шагу вашей цепочки.

Observable<String> observable = Observable.empty();
observable
  .map( value -> "Value " + value )
  .doOnNext( value -> logger.info( "Value is " + value )
  .subscribe();

Если вы выполните приведенный выше код, ничего не будет зарегистрировано, и сопоставление значений не произойдет.

С другой стороны, если вы имели в виду наблюдаемое, которое не испускает никаких значений и никогда не завершает (что делает Observable.never()), это немного сложнее. Вам нужно будет ввести таймер, который выдает ошибку по таймауту, завершив тем самым цепочку наблюдателей.

Observable<String> observable = Observable.never();
observable
  .map( value -> "Value " + value )
  .doOnNext( value -> logger.info( "Value is " + value )
  .timeout( 1, TimeUnit.SECONDS ) // (1)
  .onErrorResumeNext( Observable.empty() ) // (2)
  .subscribe();

В строке, отмеченной (1), применяется тайм-аут, а в строке, отмеченной (2), используется пустой поток для прекращения наблюдаемой цепочки.

...