page change javascript angular rxjs angular2-http

javascript - change - Angular 2: manejo de mĂșltiples suscripciones en un solo observable



router events subscribe angular 4 (1)

Esto se debe probablemente al hecho de que su Observable<Response> observable es un observable frío, es decir, se ''reinicia'' para cada nuevo suscriptor. Para obtener una explicación de los observables en caliente frente al frío, eche un vistazo a los observables en caliente y en frío: ¿hay operadores ''en caliente'' y ''en frío''? . Entonces, aquí probablemente se suscriba una vez para el controlador de resultados, y otra vez para el controlador de errores.

Debería poder solucionar el efecto secundario de las suscripciones al "compartir" su observable,

es decir, reemplazar

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

Con

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

Estoy trabajando en una aplicación Angular 2 y necesito orientación sobre cómo manejar los errores de autenticación de manera limpia.

Mi objetivo final es poder manejar centralmente los errores de autenticación (específicamente 401 y 403) para cada solicitud Http .

Encontré this pregunta muy útil para comenzar, sin embargo, estoy atascado en cuanto a la forma correcta de registrar mi controlador de errores para cada observable devuelto por mi implementación personalizada de Http .

Aquí hay una muestra de lo que estoy trabajando actualmente:

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

La solución anterior "funciona" con un problema ... Cada solicitud HTTP se realiza dos veces. Eso no es bueno.

¿Alguna orientación sobre cómo hacer esto correctamente?

(Actualización) Código de trabajo

Sobre la base de la información en la respuesta aceptada aquí está el aspecto de la clase en su forma que funciona correctamente.

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