我有一个可观察的事件流,这些事件终止于事件。但是,一旦终止,我就需要从一开始就重新开始。流的表示:
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
}
处理这种情况的好方法是什么?
根据 @maxost的注释,使用Repeat
操作员。如果您也希望它在面对错误时继续,那么您也需要在其中添加Retry
操作员。这是您需要将handleError
逻辑放置的地方,因为最终订阅将不会看到这些错误。
您需要 repeat
和 retry
,但是由于问题中的 handleError
副作用,因此不会在下游传播该异常来由retry
操作员处理。
在这里使用do
运算符类。
awaitStartEvent()
.switchMap(value -> awaitSecondEvent(value))
.doOnNext(result -> { doSomethingWithResult(result); })
.doOnError(error -> { handleError(error); })
.repeat()
.retry()
.subscribe();
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();