如何解决带错误的返回问题,使用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;。
答案 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';