2016-05-26 12 views
7

Próbuję wykonać wywołanie ajax z usługą Http, która działa poprawnie.catch nie działa dla http.get Angular2

Teraz chciałbym poradzić sobie z przypadkami awarii. Przykład, jeśli otrzymamy 404 lub jakiekolwiek inne błędy.

Korzystam z następującego kodu.

import {Component,Inject} from '@angular/core'; 
import {Http, Response,HTTP_PROVIDERS} from '@angular/http'; 
import {DoService} from './service'; 
import 'rxjs/Rx'; 
import 'rxjs/add/operator/catch'; 

@Component({ 
    selector: 'comp-one', 
    template: `<h2>My First Angular 2 App</h2>{{data}} 
     <input type="button" (click)="doSomething()" value="Do Http"/>` 
}) 

export class ComponentOne { 
    constructor(public _http:Http){ 
    console.log("It is from ComponentOne constructor.."); 
     this._http = _http; 
    } 
    data:Object; 
    doSomething(){ 
     console.log("It is from doSomething ComponentOne"); 
     let temp:any = this._http.get('people.json')//people.json is not exist, intendedly maing any error 
    .map(res => res.json()) 
     .catch((err:any)=>{ console.log("Something is wrong..")});// If i keep this line i am getting errors like "Argument of type '(err:any) => void' is not assignable to parameter of type '(err: any, caught: Observable<any>) => Observable<{}>" 
     temp.subscribe(
     (res:any)=> {this.data = res._body; console.log(res)}, 
     (error:any)=>{ console.log("It isf from error..")},//It is not even getting called this block 
     () => console.log('thire,,,ddjfladjfljasdlfj'));//In one of the forum they suggested to use this 3rd perameter, this is also not working for me. 

    } 

} 

Odpowiedz

5

Można spróbować powrócić Observable obiekt z catch zwrotnego tak:

doSomething(){ 
    console.log("It is from doSomething ComponentOne"); 
    let temp:any = this._http.get('people.json') 
    .map(res => res.json()) 
    .catch((err:any) =>{ 
     console.log("Something is wrong.."); 
     return Observable.of(undefined); <== this line 
    }); 

    temp.subscribe(
    (res:any)=> {this.data = res._body; console.log(res)}, 
    (error:any)=>{ console.log("It isf from error..")}, 
    () => console.log('thire,,,ddjfladjfljasdlfj')); 
} 
+2

co jeśli nie chcę wrócić do zaobserwowania? Chcę poradzić sobie z błędem w mojej własnej funkcji, nie pozwól by kątowe to zlikwidowało – Blauhirn

+0

zero tutaj – Flame

8

Trzeba powrócić do zaobserwowania z bloku catch jak to jest podpis tego. Więc spróbuj

return Observable.throw(new Error(error.status)); 

Oto urywek

import {Observable} from 'rxjs/Rx'; 
... 

return this.http.request(new Request(this.requestoptions)) 
    .map((res: Response) => { 
     if (res) { 
      if (res.status === 201) { 
       return [{ status: res.status, json: res }] 
      } 
      else if (res.status === 200) { 
       return [{ status: res.status, json: res }] 
      } 
     } 
    }).catch((error: any) => { 
     if (error.status === 500) { 
      return Observable.throw(new Error(error.status)); 
     } 
     else if (error.status === 400) { 
      return Observable.throw(new Error(error.status)); 
     } 
     else if (error.status === 409) { 
      return Observable.throw(new Error(error.status)); 
     } 
     else if (error.status === 406) { 
      return Observable.throw(new Error(error.status)); 
     } 
    }); 
} 

zobaczyć również

+1

Powinniśmy idealnie mieć listę stanów, które chcemy obsłużyć w tablicy, a następnie porównać z tym, aby mieć prosty Ob.throw() . W przypadku błędu 500 użytkownik nie może nic zrobić, ponieważ coś jest nie tak na serwerze, ale w przypadku 401 musi sprawdzić swoje poświadczenia i podobne – Nitin

Powiązane problemy