2016-01-28 89 views
24

我正在使用Angular 2應用程序,並需要一些關於如何處理認證錯誤的指導。Angular 2 - 在單個可觀察點上處理多個訂閱

我的最終目標是能夠集中處理身份驗證錯誤(特別是401和403),每Http請求。

我發現this問題超級有助於讓我開始,但我堅持正確的方式註冊我的自定義Http實現返回的每個observable的錯誤處理程序。

這裏是什麼,我目前正與一個樣本:

import {Injectable} from 'angular2/core'; 
    import {Http, ConnectionBackend, Request, RequestOptions, RequestOptionsArgs, Response} from 'angular2/http'; 

    import {Observable} from 'rxjs/Observable'; 


    @Injectable() 
    export class ClauthHttp extends Http { 

    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) { 
     super(backend, defaultOptions); 
    } 

    get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
     var response = super.get(url, options); 

     return this._handleSecurityResponse(response); 
    } 

    /* 
    Other overrides omitted for brevity... 
    */ 

    private _handleSecurityResponse(response: Observable<Response>):  Observable<Response> { 
     response.subscribe(null, (error: Response) => { 
      // Do some nifty error handling here. 
     }); 

     return response; 
    } 
} 

上述解決方案「作品」與一個順利......每一個HTTP請求時的兩倍。這不好。

有關如何正確執行此操作的任何指導?

(更新)工作守則

基於在這裏接受的答案的信息是類看起來像在其正常形態。

import {Injectable} from 'angular2/core'; 
    import {Http, ConnectionBackend, Request, RequestOptions, RequestOptionsArgs, Response} from 'angular2/http'; 

    import {Observable} from 'rxjs/Observable'; 
    import 'rxjs/add/operator/share'; 


    @Injectable() 
    export class ClauthHttp extends Http { 

    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions) { 
     super(backend, defaultOptions); 
    } 

    get(url: string, options?: RequestOptionsArgs): Observable<Response> { 
     var response = super.get(url, options); 

     return this._handleSecurityResponse(response); 
    } 

    /* 
    Other overrides omitted for brevity... 
    */ 

    private _handleSecurityResponse(response: Observable<Response>):  Observable<Response> { 
     var sharable = response.share(); 

     sharable.subscribe(null, (error: Response) => { 
      // Do some nifty error handling here. 
     }); 

     return sharable; 
    } 
} 

回答

29

這可能是由於你的Observable<Response>是一個寒冷的觀察到的,即它是「重新啓動」爲每一個新用戶。有關熱與冷觀測值的解釋,請看Hot and Cold observables : are there 'hot' and 'cold' operators?。所以在這裏你可能訂閱一次結果處理程序,另一次是錯誤處理程序。

您應該能夠通過 '共享' 你觀察到的要解決的訂閱副作用,

如更換

var response = super.get(url, options); 

隨着

var response = super.get(url, options).share();` 
+0

Thanks..this到底是什麼,我是尋找 – prash