2016-12-13 5 views
0

У меня есть поток наблюдаемых событий, которые заканчиваются на событии. Однако, как только я закончил, мне нужно, чтобы поток начинался снова с самого начала. Представление потока ниже:Повторяющиеся наблюдаемые потоки

awaitStartEvent() 
    .switchMap(value -> awaitSecondEvent(value)) 
    .subscribe(result -> { 
    doSomethingWithResult(result); 
    // need to start at awaitStartEvent again here 
    }, error -> { 
    handleError(error); 
    // need to start at awaitStartEvent again here 
    } 

Что такое хороший способ справиться с этой ситуацией?

+1

сделал вы пробовали 'repeat' оператор? –

+0

Не повторяется ли повторная подписка на последний наблюдаемый? то есть он будет повторно подписываться, чтобы ждатьSecondEvent вместо запуска –

+0

«повторить» resubsribes для всего восходящего потока. –

ответ

0

Как следует из комментария @ maxost, используйте оператор Repeat. Если вы хотите, чтобы он продолжался и перед лицом ошибок, вам также нужно добавить оператора Retry. Здесь вам нужно будет поместить свою логику handleError, поскольку окончательная подписка никогда не увидит эти ошибки.

0

Вам нужно repeat и retry, но так как у вас есть handleError побочный эффект в вопросе, исключение не будет распространяться вниз по течению, чтобы справиться с оператором retry.

Здесь используется класс операторов do.

awaitStartEvent() 
    .switchMap(value -> awaitSecondEvent(value)) 
    .doOnNext(result -> { doSomethingWithResult(result); }) 
    .doOnError(error -> { handleError(error); }) 
    .repeat() 
    .retry() 
    .subscribe(); 
0
awaitStartEvent() 
    .switchMap(value -> awaitSecondEvent(value)) 
    .doOnNext(result -> doSomethingWithResult(result)) //handle result 
    .repeat() //resubsribe when onComplete called 
    .doOnError(error -> handleError(error)) //handle error 
    .retry() //resubscribe when onError called 
    .subscribe(); 
Смежные вопросы