callable toretryWhen()
は、発行する Observable を返すcomplete
かerror
、ストリームを終了するか、値を発行して再サブスクライブする必要があります。
たとえば、次の理由により、このコードはエラーを発生せずに完了しますObservable.empty()
。
Observable.create(obs => {
obs.next(1);
obs.next(2);
obs.error('error from source');
})
.retryWhen((errors) => {
errors.subscribe(sourceError => console.log(sourceError));
return Observable.create(obs => obs.error('inner error'));
})
.subscribe(
val => console.log(val),
err => console.log('error', err),
_ => console.log('complete')
);
ソース Observable からのエラーはerrors
asに出力されnext
ます。ソースコードを参照してください: https://github.com/ReactiveX/rxjs/blob/master/src/operator/retryWhen.ts#L86
これはコンソールに出力されます:
1
2
error inner error
error from source
ライブデモを見る: http://plnkr.co/edit/Fajsb54WJwB8J8hkUC6j?p=preview
以下のコメントに基づいて編集します。
のドキュメントを参照してくださいretryWhen()
。
エラーが発生すると、エラーの原因となった Throwable が、 notificationHandler から返された Observable に発行されます。その Observable がonComplete または errorを呼び出した場合、再試行すると子サブスクリプションで complete または error が呼び出されます。それ以外の場合、この Observable は、特定の Scheduler でソース observable に再サブスクライブします。
したがって、コールバックから返された Observable は、再サブスクライブするかどうかを決定する責任があります。が発行された場合はnext()
、再サブスクライブします。それらを子オブザーバーに発行error()
または渡す場合。complete()
たとえば、次のことができます (このコードはテストしていません)。
return response.retryWhen((errors) => {
var retrySource = new Subject();
errors.subscribe(error => {
if (this.responseErrorProcess(error)) retrySource.next();
else retrySource.complete();
});
return retrySource;
});
内部ロジックによると、 で正しいメッセージをトリガーしますretrySource
。