Angular 如何将retryWhen与返回布尔值的函数一起使用?
这是我的密码:Angular 如何将retryWhen与返回布尔值的函数一起使用?,angular,rxjs,rxjs5,angular2-observables,Angular,Rxjs,Rxjs5,Angular2 Observables,这是我的密码: this._http.post(this._url_get + extension, '', { headers: headers }) .map(res => res['_body']) .retryWhen(errors => {return responseErrorProcess(errors)}) 现在我需要捕获异常并将它们传递给我的responseErrorProcess(),如果需要重试,它将返回true 我不知道如何从错误中检索异常,
this._http.post(this._url_get + extension, '', { headers: headers })
.map(res => res['_body'])
.retryWhen(errors => {return responseErrorProcess(errors)})
现在我需要捕获异常并将它们传递给我的responseErrorProcess()
,如果需要重试,它将返回true
我不知道如何从错误中检索异常,它看起来是这样的:
Subject_isScalar: falseclosed: falsehasError: falseisStopped: falseobservers: Array[0]thrownError: null__proto__: Observable`
它似乎不包含关于发生的异常的错误,而且我也不知道应该返回什么才能真正重试或不重试 可调用的to需要返回一个发出complete
或error
的Observable来结束流或发出一个值来重新订阅
例如,由于Observable.empty()
,此代码完成时不会发出错误:
源可观测的错误作为next
发送到errors
。请参阅源代码:
这将打印到控制台:
1
2
error inner error
error from source
见现场演示:
根据以下评论进行编辑:
查看retryWhen()
的文档:
错误将导致可丢弃的发射,从而导致notificationHandler返回的可观察对象出现错误。如果可观察调用onComplete或error,则重试将调用子订阅上的complete或error否则,此可观察对象将在特定计划程序上重新订阅源可观察对象
因此,回调返回的可观察对象负责决定是否重新订阅。如果发出next()
,则重新订阅。如果它发出error()
或complete()
将它们传递给子观察者
例如,您可以执行以下操作(我没有测试此代码):
根据您的内部逻辑,您在retrySource
retryWhen
上触发正确的消息时,应返回一个可观察的值。一旦可观测发射出以下信号,就会进行重试:
.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)
)
)
如果您希望在处理器返回false
时完成而不是出错,请将Observable.throw()
替换为Observable.empty()
谢谢!但是如何获得错误呢?你看,我们得到的错误是可以观察到的,实际上并不包含异常,与我使用.catch()得到的错误不同,它实际上包含http响应(很抱歉,我解释的方式很弱)@MotassemMK查看我更新的答案。它的工作原理与中记录的完全相同。然而,我同意这个描述经常让人非常困惑。很好,我犯了错误!但是,(很抱歉,这是第二个后续问题)如何从flatMap内部将值作为异步返回给retryWhen?这就是我所尝试的:@motassemk我更新了我的答案,看看底部。@motassemk你是对的,用subscribe()
代替flatMap
return response.retryWhen((errors) => {
var retrySource = new Subject();
errors.subscribe(error => {
if (this.responseErrorProcess(error)) retrySource.next();
else retrySource.complete();
});
return retrySource;
});
.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)
)
)