Регистрация обратного вызова onError на RxJS Observable, вызывая один и тот же http-запрос, который будет отправлен дважды в Angular 2

Я создал перехватчик HTTP в Angular 2. Код перехватчика ниже
класс экспорта HttpInterceptor расширяет Http {

  private httpSubject = new Subject<Message>();
  httpSubject$ = this.httpSubject.asObservable();
  private block : boolean = true;

    constructor(backend: ConnectionBackend, defaultOptions: RequestOptions, private _router: Router, private dataSharingService : DataSharingService) {
        super(backend, defaultOptions);
    }

    post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> { 
        this.dataSharingService.beforeRequest.emit("beforeRequestEvent"); 
        return this.intercept(super.post(url, body, this.getRequestOptionArgs(options)));
        //return super.post(url, body, this.getRequestOptionArgs(options));
    }

    put(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> {
        this.dataSharingService.beforeRequest.emit("beforeRequestEvent");
        return this.intercept(super.put(url, body, this.getRequestOptionArgs(options)));
    }



    getRequestOptionArgs(options?: RequestOptionsArgs) : RequestOptionsArgs {
        if (options == null) {
            options = new RequestOptions();
        }
        if (options.headers == null) {
            options.headers = new Headers();
        }
        //options.headers.append('Content-Type', 'application/json');
        return options;
    }


    intercept(observable: Observable<Response>): Observable<Response> {

      observable.subscribe(
            null, 
            error =>  this.dataSharingService.afterRequest.emit("afterRequestEvent"),                               
            () => this.dataSharingService.afterRequest.emit("afterRequestEvent")            
          ); 


          return observable;       

    }
}

В функции intercept, если зарегистрирован обратный вызов ошибки, браузер делает те же http-запросы дважды, и когда обратный вызов ошибки удален, то событие не запускается (что необходимо, чтобы скрыть индикатор загрузки).

По ошибке перезвон я имею в виду эту строку

error =>  this.dataSharingService.afterRequest.emit("afterRequestEvent")

в методе перехвата.

1 ответ

  1. Похоже, что субъект регистрирует subscribe () несколько раз. Не могли бы вы попробовать отписаться от observable после того, как ответ через observable возвращается обратно? В противном случае вы можете выбрать более простой способ создания нового наблюдаемого во время каждого вызова intercept() и вернуть его, чтобы избежать регистрации нескольких обратных вызовов.