2016-01-28 22 views
24

私はAngular 2アプリで作業しており、認証エラーをきれいに処理する方法についてのガイダンスが必要です。角度2 - 1つの観測で複数のサブスクリプションを扱う

私の最終目標は、Httpリクエストごとに認証エラー(特に401と403)を集中的に処理できるようにすることです。

私はthis質問のスーパーが私を始めてくれて助かりましたが、自分のカスタムHttpの実装で返された各オブザーバブルのエラーハンドラを登録する適切な方法については固執しています。

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要求が2回行われている... 1つのヒッチで「作品」:ここでは

は、私が現在働いているもののサンプルです。それはまずいです。

これを正しく行う方法に関するガイダンスはありますか?ここでは受け入れ答えの情報に基づいて

(更新)ワーキングコード

はクラスが適切に機能形でどのように見えるかです。

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?をご覧ください。したがって、ここでは結果ハンドラのために1回、エラーハンドラのもう1つの時間を購読します。あなたの観測可能 'を共有する' で、サブスクリプションの副作用を回避することができるはず

すなわち

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

Thanks..thisで

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

を置き換える私がいたまさにです探している – prash

関連する問題