Angular 4 - 可观察到的捕获错误

时间:2017-09-02 21:15:27

标签: angular

如何解决带错误的返回问题,使用Observable中的捕获?

我想在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)中的错误:   类型的论证&#39;(e:any)=&gt;空隙&#39;不能分配给参数   type&#39;(错误:any,caught:Observable)=&gt; ObservableInput&LT; {}&GT;&#39 ;.
  键入&#39; void&#39;不能分配给&#39; ObservableInput&lt; {}&gt;&#39;。

4 个答案:

答案 0 :(得分:24)

如果要在将错误响应委派给方法之前使用catch() Observable,则需要使用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()为我工作

答案 1 :(得分:15)

catch需要返回一个observable。

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

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

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

此catch将错误转换为null val,然后filter不会让falsey值通过。但是,这会阻止任何虚假价值的管道,所以如果你认为这些可能会通过并且你想要它们,那么你需要更明确/更有创意。

编辑:

停止管道的更好方法是

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

答案 2 :(得分:4)

使用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
      throwError(e) 
  }));

答案 3 :(得分:2)

你应该在下面使用

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

使用以下行

导入throw运算符
import 'rxjs/add/observable/throw';