gpt4 book ai didi

javascript - Angular 2 - 在单个可观察对象上处理多个订阅

转载 作者:太空狗 更新时间:2023-10-29 16:50:15 25 4
gpt4 key购买 nike

我正在开发 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;
}
}

最佳答案

这可能是因为您的 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();`

关于javascript - Angular 2 - 在单个可观察对象上处理多个订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35063537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com