如何将 retryWhen 与 returns 布尔值的函数一起使用?
How to use retryWhen with a function that returns a Boolean?
这是我的代码:
this._http.post(this._url_get + extension, '', { headers: headers })
.map(res => res['_body'])
.retryWhen(errors => {return responseErrorProcess(errors)})
现在我需要捕获异常并将它们传递给我的 responseErrorProcess()
returns true
如果它需要重试
我不知道如何从 errors
中检索异常,这是它的样子:
Subject_isScalar: falseclosed: falsehasError: falseisStopped: falseobservers: Array[0]thrownError: null__proto__: Observable`
它似乎不包含有关发生的异常的错误,而且我无法弄清楚我应该 return 什么才能真正重试或不重试。
retryWhen()
的可调用对象需要 return 发出 complete
或 error
的 Observable 以结束流或发出一个值以重新订阅。
例如,由于 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 的错误作为 next
发送到 errors
。查看源代码: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()
的文档:
An error will cause the emission of the Throwable that cause the error to the Observable returned from notificationHandler. If that Observable calls onComplete or error then retry will call complete or error on the child subscription. Otherwise, this Observable will resubscribe to the source observable, on a particular Scheduler.
因此回调中的 Observable return 负责决定是否重新订阅。如果它发出 next()
,则重新订阅。如果它发出 error()
或 complete()
将它们传递给子 Observer。
例如你可以这样做(我没有测试这段代码):
return response.retryWhen((errors) => {
var retrySource = new Subject();
errors.subscribe(error => {
if (this.responseErrorProcess(error)) retrySource.next();
else retrySource.complete();
});
return retrySource;
});
根据您的内在逻辑,您在 retrySource
上触发了正确的消息。
retryWhen
应该 return 一个 Observable。一旦 observable 发出,就会发生重试:
.retryWhen(errors =>
//switchMap to retrieve the source error
errors.switchMap(sourceErr =>
//send source to processor
responseErrorsProcess(sourceErr) ?
//if result is TRUE, emit (will cause retry). Else, pass on the error
Observable.of(true): Observable.throw(sourceErr)
)
)
如果您想在处理器 returns false
时完成而不是错误,请将 Observable.throw()
替换为 Observable.empty()
这是我的代码:
this._http.post(this._url_get + extension, '', { headers: headers })
.map(res => res['_body'])
.retryWhen(errors => {return responseErrorProcess(errors)})
现在我需要捕获异常并将它们传递给我的 responseErrorProcess()
returns true
如果它需要重试
我不知道如何从 errors
中检索异常,这是它的样子:
Subject_isScalar: falseclosed: falsehasError: falseisStopped: falseobservers: Array[0]thrownError: null__proto__: Observable`
它似乎不包含有关发生的异常的错误,而且我无法弄清楚我应该 return 什么才能真正重试或不重试。
retryWhen()
的可调用对象需要 return 发出 complete
或 error
的 Observable 以结束流或发出一个值以重新订阅。
例如,由于 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 的错误作为 next
发送到 errors
。查看源代码: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()
的文档:
An error will cause the emission of the Throwable that cause the error to the Observable returned from notificationHandler. If that Observable calls onComplete or error then retry will call complete or error on the child subscription. Otherwise, this Observable will resubscribe to the source observable, on a particular Scheduler.
因此回调中的 Observable return 负责决定是否重新订阅。如果它发出 next()
,则重新订阅。如果它发出 error()
或 complete()
将它们传递给子 Observer。
例如你可以这样做(我没有测试这段代码):
return response.retryWhen((errors) => {
var retrySource = new Subject();
errors.subscribe(error => {
if (this.responseErrorProcess(error)) retrySource.next();
else retrySource.complete();
});
return retrySource;
});
根据您的内在逻辑,您在 retrySource
上触发了正确的消息。
retryWhen
应该 return 一个 Observable。一旦 observable 发出,就会发生重试:
.retryWhen(errors =>
//switchMap to retrieve the source error
errors.switchMap(sourceErr =>
//send source to processor
responseErrorsProcess(sourceErr) ?
//if result is TRUE, emit (will cause retry). Else, pass on the error
Observable.of(true): Observable.throw(sourceErr)
)
)
如果您想在处理器 returns false
时完成而不是错误,请将 Observable.throw()
替换为 Observable.empty()