Angular 4 - Наблюдаемая ошибка вылова

Как я могу решить проблему возврата с ошибкой, использовать захват внутри Observable?

Я хочу выполнить функцию внутри catch, чтобы выполнить некоторую проверку до того, как будет выполнена подписка.

Заранее благодарю вас за большое внимание.

Ошибка возникает в → .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' не присваивается параметру type '(err: any, catch: Observable) = > ObservableInput < {} > '.
Тип 'void' не присваивается типу 'ObservableInput < {} > '.

Ответ 1

Если вы хотите использовать 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)
  }
}

Ответ 2

поймать нужно вернуть наблюдаемое.

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

если вы хотите остановить конвейер после обнаруженной ошибки, сделайте следующее:

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

эта ловушка преобразует ошибку в нулевое значение, а затем фильтр не пропускает значения Falsey. Это, однако, остановит конвейер для ЛЮБОГО ложного значения, поэтому, если вы думаете, что они могут прийти, и вы хотите, чтобы вы, вы должны быть более откровенными/творческими.

редактировать:

Лучший способ остановить трубопровод - сделать

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

Ответ 3

С угловыми 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);
    }),
  );

Ответ 4

Вы должны использовать ниже

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

Импортируйте оператор throw, используя следующую строку

import 'rxjs/add/observable/throw';