2016-05-26 5 views
7

Sto tentando di effettuare una chiamata Ajax con il servizio Http, che funziona correttamente.catch non funziona per http.get Angular2

Ora mi piacerebbe gestire i casi di fallimento. Esempio se otteniamo 404 o altri errori.

Sto usando il seguente codice.

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. 

    } 

} 

risposta

5

Si può cercare di tornare Observable oggetto dal catch callback come questo:

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

cosa succede se non voglio restituire un osservabile? Voglio gestire l'errore nella mia stessa funzione, non lasciare che facciano questa spiegazione zero – Blauhirn

+0

qui – Flame

8

è necessario restituire osservabile dal blocco catch come questa è la firma del presente. Quindi cercate

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

Ecco l'frammento di

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)); 
     } 
    }); 
} 

vedi anche

+1

Dovremmo idealmente avere un elenco di stati che vogliamo gestire in un array e quindi confrontarci con quello di avere un semplice Ob.throw() . Per l'errore 500, l'utente non può fare nulla dal momento che qualcosa di sbagliato sul server, ma per il 401 hanno bisogno di verificare le proprie credenziali e simili – Nitin