28

私はAngular 2アプリに取り組んでおり、認証エラーをきれいに処理する方法についていくつかのガイダンスが必要です.

Http私の最終目標は、すべてのリクエストの認証エラー (具体的には 401 と 403) を一元的に処理できるようにすることです。

この質問は、開始するのに非常に役立ちましたが、カスタム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;
    }
}

上記のソリューションは、1 回のヒッチで「機能」します... すべての HTTP リクエストは 2 回行われます。それは良くないね。

これを適切に行う方法に関するガイダンスはありますか?

(更新) 作業コード

ここで受け入れられた回答の情報に基づいて、適切に機能する形式でクラスがどのように見えるかを示します。

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;
    }
}
4

1 に答える 1

32

これはおそらく、あなたObservable<Response>がコールドオブザーバブルであるという事実によるものです。つまり、新しいサブスクライバーごとに「再起動」されます。ホット オブザーバブルとコールド オブザーバブルの説明については、ホットオブザーバブルとコールド オブザーバブルをご覧ください。「ホット」と「コールド」の演算子はありますか? . したがって、ここではおそらく、結果ハンドラー用に 1 回サブスクライブし、エラー ハンドラー用に別のサブスクライブを行うことになります。

オブザーバブルを「共有」することで、サブスクリプションの副作用を回避できるはずです。

すなわち交換

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

var response = super.get(url, options).share();`
于 2016-01-28T14:26:31.433 に答える