可调用对象retryWhen()
需要返回一个 Observable,该 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 或错误,则 retry 将在子订阅上调用完成或错误。否则,此 Observable 将在特定调度程序上重新订阅源 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
。