Angular 4 - Observable catch error
问题描述:
如何解决带有错误的返回问题,使用Observable内部的捕获?Angular 4 - Observable catch error
我想在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)});
}
}
错误
ERROR在/ XXXXXX /应用/ SRC /应用/compare/service.ts(28,17): 类型'(e:any)=> void'的参数不能分配给参数 type'(err:any,caught:Observable)=> ObservableInput < {} >”。
类型'void'不可分配给类型'ObservableInput < {}>'。
答
使用下面
return Observable.throw(error || 'Internal Server error');
导入throw
运营商如果要使用的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()
工作对我来说
答
catch需要返回一个observable。
.catch(e => { console.log(e); return Observable.of(e); })
,如果你想抓住一个错误后停止管道,那么这样做:
.catch(e => { console.log(e); return Observable.of(null); }).filter(e => !!e)
这个抓变换误差为空VAL,然后过滤不让falsey值通过。然而,这将阻止任何虚假价值的管道,所以如果你认为这些可能会通过并且你想要它们,你需要更加明确/有创意。
答
你应该使用下面的线
import 'rxjs/add/observable/throw';
只有当你想通过传递错误。如果你的目标是真正处理/捕捉错误,那么你不应该再抛出。 – bryan60
@ bryan60请详细说明! – Aravind
Observable.throw()抛出一个错误,以便可观察序列的其余部分跳过并直接进入订户的错误处理程序。如果这不符合您的预期行为,您可以选择不重新抛出并返回可观察值。这真的取决于你的用例。 – bryan60