Mot*_* MK 2 rxjs rxjs5 angular2-observables angular
这是我的代码:
this._http.post(this._url_get + extension, '', { headers: headers })
.map(res => res['_body'])
.retryWhen(errors => {return responseErrorProcess(errors)})
Run Code Online (Sandbox Code Playgroud)
现在我需要捕获异常并将它们传递给我responseErrorProcess(),true如果它需要重试则返回
我无法弄清楚如何从中检索异常errors,这是它的样子:
Subject_isScalar: falseclosed: falsehasError: falseisStopped: falseobservers: Array[0]thrownError: null__proto__: Observable`
Run Code Online (Sandbox Code Playgroud)
它似乎没有包含有关发生的异常的错误,而且我无法弄清楚应该返回什么以便实际重试.
retryWhen应该返回一个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)
)
)
Run Code Online (Sandbox Code Playgroud)
如果要在处理器返回时完成而不是出错,请false替换Observable.throw()为Observable.empty()
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')
);
Run Code Online (Sandbox Code Playgroud)
来自源 Observable 的错误被发送到errorsas next。查看源代码:https : //github.com/ReactiveX/rxjs/blob/master/src/operator/retryWhen.ts#L86
这打印到控制台:
1
2
error inner error
error from source
Run Code Online (Sandbox Code Playgroud)
看现场演示:http : //plnkr.co/edit/Fajsb54WJwB8J8hkUC6j?p=preview
根据以下评论进行编辑:
查看文档retryWhen():
一个错误将导致 Throwable 的发射,从而导致从 notificationHandler 返回的 Observable 的错误。如果 Observable 调用onComplete 或 error,则重试将调用子订阅的 complete 或 error。否则,此 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;
});
Run Code Online (Sandbox Code Playgroud)
根据您的内在逻辑,您会在 上触发正确的消息retrySource。
| 归档时间: |
|
| 查看次数: |
5473 次 |
| 最近记录: |