Угловой 2 обещают скинуть ошибку


Я пытаюсь создать сервис, который обрабатывает контакты в Angular 2. Это то, что я получил до сих пор.

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

Теперь служба работает нормально, если я получаю код состояния 400+ в ответе, код переходит в состояние catch, Если это код 200, он переходит в состояние then и возвращает ответ.

Но когда я использую его внутри компонента, он переходит в состояние then независимо от того, является ли респон нормальным или нет.

addingContact() {
  this.contactsService
    .addContact(this.user)
    .then(
      (contactx) => { console.log('THEN = ' + JSON.stringify(contactx)); },
      (err) => { console.log('CATCH = ' + JSON.stringify(err)); }
    );
}

Есть ли что-то, что я упускаю, должен ли я бросить что-то на службу Итак, код переходит в начало ошибки, когда я получаю код состояния 400+?

Заранее благодарю тебя, Дэниел!

2 4

2 ответа:

Вы проглатываете ошибку в catch, у вас все еще может быть предложение catch для преобразования ошибки, но вам нужно вернуть отклоненное обещание из него. Что-то вроде этого:

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

Должен ли я бросить что-то на сервис, чтобы код шел в начало ошибки в случае, если я получу код состояния 400+?

Да, потому что прямо сейчас ваше catch заявление службы проглатывает ошибку.

Вы также можете избавиться от оператора catch, но вам придется не забыть добавить его в каждый фрагмент кода, который использует addContact.