Angular 4 - Observable捕获错误

29

如何使用 Observable 中的 capture 解决返回错误的问题?

我希望在 catch 内执行一个函数,以在执行 subscribe 之前进行一些验证。

非常感谢您的关注和提前致谢。

错误发生在 -> .catch((e) => {console.log(e)})

import { Injectable } from '@angular/core';
import { Headers, Http, ResponseOptions} from '@angular/http';
import { AuthHttp } from 'angular2-jwt';

import { MEAT_API } from '../app.api';

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';

@Injectable()
export class  CompareNfeService {


    constructor(private http: AuthHttp) { }

    envirArquivos(order): Observable<any> {
        const headers = new Headers();
        return this.http.post(`${MEAT_API}compare/arquivo`, order,
        new ResponseOptions({headers: headers}))
        .map(response => response.json())
        .catch( (e) => {console.log(e)} );
    }
}

错误

/XXXXXX/application/src/app/compare/service.ts (28,17) 中出错: 类型 '(e: any) => void' 的参数不能赋值给类型 '(err: any, caught: Observable) => ObservableInput<{}>' 的参数。
类型 'void' 不能赋值给类型 'ObservableInput<{}>'。

4个回答

34
如果您想使用Observable的catch()方法,需要在将错误响应委托给方法之前使用Observable.throw()方法。

import { Injectable } from '@angular/core';
import { Headers, Http, ResponseOptions} from '@angular/http';
import { AuthHttp } from 'angular2-jwt';

import { MEAT_API } from '../app.api';

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';

@Injectable()
export class CompareNfeService {


  constructor(private http: AuthHttp) {}

  envirArquivos(order): Observable < any > {
    const headers = new Headers();
    return this.http.post(`${MEAT_API}compare/arquivo`, order,
        new ResponseOptions({
          headers: headers
        }))
      .map(response => response.json())
      .catch((e: any) => Observable.throw(this.errorHandler(e)));
  }

  errorHandler(error: any): void {
    console.log(error)
  }
}

使用Observable.throw()对我很有效。


24

使用 angular 6 和 rxjs 6 中的 Observable.throw()Observable.off() 已被弃用,您需要改为使用 throwError

示例:

return this.http.get('yoururl')
  .pipe(
    map(response => response.json()),
    catchError((e: any) =>{
      //do your processing here
      return throwError(e);
    }),
  );

16

catch需要返回一个可观察对象。

.catch(e => { console.log(e); return Observable.of(e); })

如果你想在捕获错误后停止管道,请执行以下操作:

.catch(e => { console.log(e); return Observable.of(null); }).filter(e => !!e)

这个catch语句将错误转换为null值,然后filter操作不会传递假值。但是任何假值都会停止管道的运行,因此如果你认为可能会出现假值,并且你希望它们通过,则需要更加明确/有创意。

编辑:

更好的停止管道的方法是执行:

.catch(e => Observable.empty())

2
或者只需 .catch(e => Observable.never()) - John Strickler

2
您应该使用以下内容
return Observable.throw(error || 'Internal Server error');

使用以下代码导入 throw 运算符

import 'rxjs/add/observable/throw';

只有在您想通过错误时,才会执行这样的操作。如果您真正要处理或捕获错误,那么就不应该重新抛出。 - bryan60
@bryan60,请详细阐述一下! - Aravind
Observable.throw() 会抛出一个错误,这样可观察序列的其余部分将被跳过,直接进入订阅者的错误处理程序。如果这不是您想要的行为,您可以选择不重新抛出错误,而只返回一个可观察对象。这真的取决于您的用例。 - bryan60

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接