Estoy tratando de crear un servicio que maneje contactos en Angular 2. Esto es lo que obtuve hasta ahora.
import { Injectable } from '@angular/core'; import { Http } from '@angular/http'; import 'rxjs/add/operator/toPromise'; @Injectable() export class ContactsService { constructor(private http: Http) { } addContact(contact): Promise<any> { return this.http .post('http://localhost:8000/contacts', contact) .toPromise() .then(response => response.json()) .catch(error => error.json()); } } Ahora el servicio funciona bien, si obtengo un código de estado de más de 400+ en la respuesta, el código va a la catch fija, si es un código de 200 then va al estado y devuelve la respuesta.
Pero cuando lo uso dentro de un componente then pasa al estado sin importar si la respuesta está bien o no.
addingContact() { this.contactsService .addContact(this.user) .then( (contactx) => { console.log('THEN = ' + JSON.stringify(contactx)); }, (err) => { console.log('CATCH = ' + JSON.stringify(err)); } ); } ¿Hay algo que me falta? ¿Debería lanzar algo en el servicio para que el código vaya al inicio de error en caso de que obtenga un código de estado de más de 400+ ?
¡Gracias de antemano, Daniel!
Está tragando el error en la captura, aún puede tener una cláusula de captura para transformar el error, pero debe devolver una Promesa rechazada. Algo como eso:
let httpPromiseMock = new Promise((resolve, reject)=> { reject('400 error'); }); httpPromiseMock .then(x=> {console.log(x); return x*2;}) .catch(x=> Promise.reject(`my error is ${x}`)) .then(x=>console.log('good',x), err=>console.log('bad', err));¿Debería lanzar algo en el servicio para que el código vaya al inicio del error en caso de que obtenga un código de estado de más de 400?
Sí, porque en este momento, su declaración de catch del servicio se está tragando el error.
También puede deshacerse de la instrucción catch allí, pero deberá recordar agregar una en cada pieza de código que use addContact .