Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 如何将retryWhen与返回布尔值的函数一起使用?_Angular_Rxjs_Rxjs5_Angular2 Observables - Fatal编程技术网

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)
    )
)