Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/406.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度2-处理单个可观察对象上的多个订阅_Javascript_Angular_Rxjs_Angular2 Http - Fatal编程技术网

Javascript 角度2-处理单个可观察对象上的多个订阅

Javascript 角度2-处理单个可观察对象上的多个订阅,javascript,angular,rxjs,angular2-http,Javascript,Angular,Rxjs,Angular2 Http,我正在开发Angular 2应用程序,需要一些关于如何干净地处理身份验证错误的指导 我的最终目标是能够为每个Http请求集中处理身份验证错误(特别是401和403) 我发现这个问题非常有助于我开始学习,但是我一直想知道如何正确地为自定义Http实现返回的每个可观察对象注册错误处理程序 以下是我目前正在使用的示例: import { Injectable } from 'angular2/core'; import { Http, ConnectionBackend, Request, Reque

我正在开发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;
    }
}
从'angular2/core'导入{Injectable};
从'angular2/Http'导入{Http,ConnectionBackend,Request,RequestOptions,RequestOptions Args,Response};
从“rxjs/Observable”导入{Observable};
@可注射()
导出类ClauthHttp扩展Http{
构造函数(后端:ConnectionBackend,defaultOptions:RequestOptions){
超级(后端,默认选项);
}
获取(url:string,options?:RequestOptionsArgs):可观察{
var response=super.get(url,选项);
返回此信息。_handleSecurityResponse(响应);
}
/*
为简洁起见,省略了其他覆盖。。。
*/
私人安全响应(响应:可观察):可观察{
response.subscribe(null,(错误: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;
    }
}
从'angular2/core'导入{Injectable};
从'angular2/Http'导入{Http,ConnectionBackend,Request,RequestOptions,RequestOptions Args,Response};
从“rxjs/Observable”导入{Observable};
导入“rxjs/add/operator/share”;
@可注射()
导出类ClauthHttp扩展Http{
构造函数(后端:ConnectionBackend,defaultOptions:RequestOptions){
超级(后端,默认选项);
}
获取(url:string,options?:RequestOptionsArgs):可观察{
var response=super.get(url,选项);
返回此信息。_handleSecurityResponse(响应);
}
/*
为简洁起见,省略了其他覆盖。。。
*/
私人安全响应(响应:可观察):可观察{
var sharable=response.share();
sharable.subscribe(空,(错误:响应)=>{
//在这里做一些漂亮的错误处理。
});
返回可共享;
}
}

这可能是因为您的
可观察对象
是冷可观察对象,即每个新订户都会“重新启动”。有关热观测与冷观测的解释,请参阅。因此,这里您可能会订阅一次结果处理程序,另一次订阅错误处理程序

您应该能够通过“共享”您的可观测数据来解决订阅的副作用

i、 e.更换

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


谢谢……这正是我想要的
var response = super.get(url, options).share();`