2017-09-02 67 views
2

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

回答

3

使用下面

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()工作对我来说

3

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值通过。然而,这将阻止任何虚假价值的管道,所以如果你认为这些可能会通过并且你想要它们,你需要更加明确/有创意。

0

你应该使用下面的线

import 'rxjs/add/observable/throw'; 
+0

只有当你想通过传递错误。如果你的目标是真正处理/捕捉错误,那么你不应该再抛出。 – bryan60

+0

@ bryan60请详细说明! – Aravind

+0

Observable.throw()抛出一个错误,以便可观察序列的其余部分跳过并直接进入订户的错误处理程序。如果这不符合您的预期行为,您可以选择不重新抛出并返回可观察值。这真的取决于你的用例。 – bryan60