2017-05-01 118 views
4

我正在嘗試做一個處理Angular 2中的聯繫人的服務。這就是我到目前爲止所做的。現在Angular 2 Promise throw error

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+狀態代碼?

先謝謝你了,丹尼爾!

+0

事實上,你的代碼上面解決了我的問題:)。謝謝! – Devner

回答

5

你正在吞下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)); 
+0

修改服務.catch(錯誤= > Promise.reject(error.json())),它的工作原理與我預期的一樣,非常感謝! –

2

我應該在服務上拋出一些東西,所以如果我得到一個400+狀態碼,代碼會出現錯誤開始?

是的,因爲現在,您的catch服務聲明吞嚥了錯誤。

您也可以在那裏擺脫catch聲明,但是您必須記住在使用addContact的每段代碼中添加一個。

+0

謝謝,我現在明白我做錯了什麼,我仍然解決它,即使在捕獲狀態,這可能是爲什麼它不會返回組件中的錯誤,修復它與Promise.thomas –