2017-02-08 56 views
7

我覺得這種情況應該在Angular 2文檔中,但我無法在任何地方找到它。Angular 2 - 檢查訂閱服務器錯誤

這裏的情景

  1. 提交表單(創建對象)是在服務器上無效
  2. 服務器返回一個錯誤,一個400錯誤的請求我以後的形式
  3. 上顯示的訂閱回來,我想檢查一個錯誤變量或東西(即如果沒有錯誤>然後路由到新創建的詳細信息頁)

我想象它的工作原理是這樣的:

this.projectService.create(project) 
    .subscribe(
     result => console.log(result), 
     error => { 
      this.errors = error 
     } 
    ); 
} 

if (!this.errors) { 
    //route to new page 
} 

我對Angular 2非常陌生,所以這可能來自於我對Observable的工作原理缺乏瞭解。我沒有在窗體上顯示這些數據的問題,但無法弄清楚如何在ts組件中看到它。我真的只想檢查http創建的成功/失敗。

回答

24

正如在相關的RxJS文檔中所述,如果沒有錯誤,.subscribe() method可以接受第三個在完成時調用的參數。

參考:

  1. [onNext]Function):功能調用在可觀察到的序列中的每個元素。
  2. [onError]Function):在可觀察序列異常終止時調用的函數。
  3. [onCompleted]Function):在可觀察序列的正常終止時調用的函數。

因此,你可以處理你的路由邏輯在onCompleted回調,因爲它會在正常終止(這意味着不會有任何錯誤,當它被調用)被調用。

this.httpService.makeRequest() 
    .subscribe(
     result => { 
     // Handle result 
     console.log(result) 
     }, 
     error => { 
     this.errors = error; 
     }, 
    () => { 
     // 'onCompleted' callback. 
     // No errors, route to new page here 
     } 
    ); 

作爲一個方面說明,也有.finally() method被稱爲上完成,無論呼叫的成功/失敗的。這對於那些總是希望在HTTP請求後執行某些邏輯而不考慮結果(即用於記錄目的或用於某些UI交互(如顯示模式))的情況可能會有所幫助。

Rx.Observable.prototype.finally(action)

調用可觀察序列正常或異常終止源之後的指定的操作。

舉例來說,這裏是一個基本的例子:

import { Observable } from 'rxjs/Rx'; 
import 'rxjs/add/operator/finally'; 

// ... 

this.httpService.getRequest() 
    .finally(() => { 
     // Execute after graceful or exceptionally termination 
     console.log('Handle logging logic...'); 
    }) 
    .subscribe (
     result => { 
     // Handle result 
     console.log(result) 
     }, 
     error => { 
     this.errors = error; 
     }, 
    () => { 
     // No errors, route to new page 
     } 
    ); 
+1

出所有我發現關於觀測的錯誤處理問題的答案實現的,這是最好的。謝謝 –

1

您可以通過以下方式

this.projectService.create(project) 
    .subscribe(
     result => { 
     console.log(result); 
     }, 
     error => { 
      console.log(error); 
      this.errors = error 
     } 
    ); 
} 

if (!this.errors) { 
    //route to new page 
}