【问题标题】:Angular 2 - Handling multiple subscriptions on a single observableAngular 2 - 在单个 observable 上处理多个订阅
【发布时间】:2016-05-05 22:47:27
【问题描述】:

我正在开发一个 Angular 2 应用程序,需要一些关于如何干净地处理身份验证错误的指导。

我的最终目标是能够集中处理每个 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 请求都会发出两次。那不好。

有关如何正确执行此操作的任何指导?

(更新)工作代码

根据接受的答案中的信息,这里是类在其正常运行的形式中的样子。

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

【问题讨论】:

    标签: javascript angular rxjs angular2-http


    【解决方案1】:

    这可能是因为您的Observable&lt;Response&gt; 是一个冷的可观察对象,即每个新订阅者都会“重新启动”它。有关热与冷可观察物的解释,请查看Hot and Cold observables : are there 'hot' and 'cold' operators?。所以在这里你可能订阅了一次结果处理程序,另一次订阅了错误处理程序。

    您应该能够通过“共享”您的 observable 来解决订阅的副作用,

    即替换

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

    有

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

    【讨论】:

    • 谢谢..这正是我想要的
    猜你喜欢
    • 2017-01-30
    • 2021-11-19
    • 2017-03-02
    • 1970-01-01
    • 2017-06-09
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    相关资源
    最近更新 更多