Angular 2承诺抛出错误。

6

我正在尝试创建一个处理联系人的 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+状态码,是否应该在服务上添加某些内容,以便代码转到错误起始点?

提前感谢您,丹尼尔!


1
实际上,您上面的代码解决了我的问题:)。谢谢! - Devner
2个回答

8

在catch语句中捕获错误后,您仍然可以使用catch子句转换错误,但需要从其中返回一个被拒绝的Promise。类似于这样:

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

我修改了服务为.catch(error => Promise.reject(error.json())),它的工作方式正如我所期望的那样,非常感谢! - Pacuraru Daniel

2

如果我得到400+状态码,我是否应该在服务上扔些东西以便代码进入错误开始?

是的,因为目前你的服务的catch语句会吞噬错误。

你也可以去掉那里的catch语句,但你必须记住在使用addContact的每一段代码中添加一个catch语句。


谢谢,我现在明白我做错了什么,即使在catch状态下我仍然解决了它,这可能是为什么组件没有返回错误的原因,但我用Promise.reject修复了它。 - Pacuraru Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接