Angular 4-可观察的捕获误差



如何解决错误的返回问题,使用可观察的捕获?

我想在捕获物中执行功能,在执行订阅之前进行一些验证。

预先感谢您,非常感谢您的关注。

错误发生在 -> .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)} );
    }
}

错误

/xxxxxxx/application/src/app/compare/service.ts(28,17)中的错误 类型'(e:any)=> void'的参数不能分配给参数 type'(err:任何,捕获:可观察)=> observableInput&lt; {}>'。
键入'void'不能分配到type'observableInput&lt; {}>'。

如果要使用Observablecatch(),则需要在将错误响应委派给方法

之前使用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()为我工作

带有Angular 6和rxjs 6 Observable.throw()Observable.off()已弃用,您需要使用throwError

ex:

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

需要返回可观察的。

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

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

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

此捕获将误差转换为空瓦尔,然后过滤器不会让假值通过。但是,这将阻止管道的任何虚假价值,因此,如果您认为这些价值可能会通过并且想要它们,则需要更加明确/创意。

编辑:

停止管道的更好方法是做

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

您应该使用以下

return Observable.throw(error || 'Internal Server error');

使用以下行导入throw操作员

import 'rxjs/add/observable/throw';

最新更新