Rxjs 角度5-无法解析observable.catch()中的observable

Rxjs 角度5-无法解析observable.catch()中的observable,rxjs,angular2-observables,angular5,Rxjs,Angular2 Observables,Angular5,我第一次来这里,希望你能帮助我 我正在尝试在Angular 5上创建一个响应拦截器。我希望成功处理状态为[202]的响应 我正在调用一个Web服务,拦截器工作正常,它捕获了错误。如果我返回Observable.throw(“”),这将到达subscribe上的错误函数,但是当我尝试返回一个新的Observable来解决异常时,它不会到达subscribe的成功方法 拦截器代码: import {Injectable} from '@angular/core'; import {HttpError

我第一次来这里,希望你能帮助我

我正在尝试在Angular 5上创建一个响应拦截器。我希望成功处理状态为[202]的响应

我正在调用一个Web服务,拦截器工作正常,它捕获了错误。如果我返回Observable.throw(“”),这将到达subscribe上的错误函数,但是当我尝试返回一个新的Observable来解决异常时,它不会到达subscribe的成功方法

拦截器代码:

import {Injectable} from '@angular/core';
import {HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, 
HttpRequest, HttpResponse} from '@angular/common/http';
import {Observable} from 'rxjs/Rx';


@Injectable()
export class Handle2xxResponseInterceptor implements HttpInterceptor{

 intercept(req: HttpRequest<any>, next: HttpHandler): 
 Observable<HttpEvent<any>> {

   return next.handle(req).catch(error => {
     if (error instanceof HttpErrorResponse) {
       if (error.status === 202) {
        return Observable.of(error); // or return Observable.empty();
       }
     }
     return Observable.throw(error);
   });
 }
}
从'@angular/core'导入{Injectable};
导入{HttpErrorResponse,HttpEvent,HttpHandler,HttpInterceptor,
HttpRequest,HttpResponse}来自“@angular/common/http”;
从'rxjs/Rx'导入{Observable};
@可注射()
导出类Handle2xxResponseInterceptor实现HttpInterceptor{
拦截(请求:HttpRequest,下一步:HttpHandler):
可观察{
返回next.handle(req.catch)(错误=>{
if(HttpErrorResponse的错误实例){
如果(error.status==202){
return Observable.of(error);//或return Observable.empty();
}
}
返回可观察抛出(错误);
});
}
}

谢谢大家。

您无法捕获202,因为202不是http错误代码,而catch只捕获错误。相反,只需使用法线贴图、do运算符或更高阶运算符(如switchMap)即可对其执行任何操作:

return next.handle(req).switchMap(response => {
  if (response.status === 202) {
    // process error
    return Observable.empty();
  }
  return Observable.of(response);
});

您无法捕获202,因为202不是http错误代码,而catch只捕获错误。相反,只需使用法线贴图、do运算符或更高阶运算符(如switchMap)即可对其执行任何操作:

return next.handle(req).switchMap(response => {
  if (response.status === 202) {
    // process error
    return Observable.empty();
  }
  return Observable.of(response);
});

你好,布莱恩60。先谢谢你。在这种情况下,状态代码202被认为是错误的,因为后端没有发送主体。无论如何,在catch操作中成功解析可观察对象的最佳方法是什么?似乎当我试图返回一个新的可观察对象时,之前的链条已经断了。物体的存在与否与它是否被解释为错误无关。重要的是状态代码。202表示您的请求已被接受,并且没有包含正文的要求。Angular将200-299范围解释为非错误响应。如果您说Angular抛出错误是因为您使用的是httpclient,并且您告诉它需要json响应,但响应正文实际上是非json的,然后问题是您的错误实际上不是http错误,它是一个没有状态的运行时错误,并且您没有进入检测http错误和状态的块。只需将响应记录下来,就可以清楚地知道发生了什么。不过,您可能应该构建您的服务以期望正确的响应类型。您可以使用option参数观察整个响应或将其设置为预期text.Hi@bryan60。先谢谢你。在这种情况下,状态代码202被认为是错误的,因为后端没有发送主体。无论如何,在catch操作中成功解析可观察对象的最佳方法是什么?似乎当我试图返回一个新的可观察对象时,之前的链条已经断了。物体的存在与否与它是否被解释为错误无关。重要的是状态代码。202表示您的请求已被接受,并且没有包含正文的要求。Angular将200-299范围解释为非错误响应。如果您说Angular抛出错误是因为您使用的是httpclient,并且您告诉它需要json响应,但响应正文实际上是非json的,然后问题是您的错误实际上不是http错误,它是一个没有状态的运行时错误,并且您没有进入检测http错误和状态的块。只需将响应记录下来,就可以清楚地知道发生了什么。不过,您可能应该构建您的服务以期望正确的响应类型。您可以使用option参数观察整个响应或将其设置为预期文本。