Angular 5 - Http Interceptor и поведение Тема вопроса - PullRequest
0 голосов
/ 27 июня 2018

Я сталкиваюсь с проблемой, когда использую http-перехватчики (для перехвата http-запроса и ответа) и субъект субъекта (для связи между двумя службами на основе перехватчиков). У меня есть сценарий, в котором мне нужно отслеживать все http-вызовы, происходящие в приложении, и выполнять определенный HTTP-пост-вызов только тогда, когда в приложении нет других http-вызовов.

У меня есть служба перехвата, где я перехватываю все запросы и ответы http, и когда не происходит никакого вызова, переменная счетчика равна 0, затем использует тему поведения ok $, подписывает ее в другой службе 2 и оттуда делает конкретный http пост-звонок. Эта подписка не происходит во второй раз, когда значение ok $ изменяется.

Служба перехватчика:

import { Injectable } from '@angular/core';
import { HttpResponse, HttpEvent, HttpClient, HttpHeaders, HttpInterceptor, HttpHandler, HttpRequest, HttpErrorResponse } from '@angular/common/http';
import { BehaviorSubject  } from 'rxjs';
import 'rxjs/add/operator/do';

@Injectable()
export class InterceptorService {
  counter: number = 0;
  public ok$: BehaviorSubject<any>;


  constructor() {
    this.ok$ = new BehaviorSubject(false);
}

  checkCounter() {

    if (this.counter === 0) {
       setTimeout(() => {
         this.checkCounterFinally();
       }, 1000);
    }
  }


  checkCounterFinally() {
    if (this.counter === 0) {
      this.ok$.next(true);
    }

  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    if (this.counter === -1)
      this.counter = 1;
    else
      this.counter++;
    return next.handle(req).do(
      (event: HttpEvent<any>) => {
        if (event instanceof HttpResponse) {
          console.log(event);
          this.counter--;
          this.checkCounter();
        }
      },
      (error: any) => {
        (event instanceof HttpErrorResponse)
        {
          if (error instanceof HttpErrorResponse) {
            if (error.status != 200) {
              console.log(error);
            }
          }
        }
      }
    );
  }

}

Услуга 2: Звонить отдыхающим:

import { Injectable } from '@angular/core';
import { LogService } from '../common/log.service';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable, BehaviorSubject } from 'rxjs';
import { InterceptorService } from './interceptor.service';


@Injectable()
export class WorkerService {


  data: string;
  storage = this.LogService.storage;
  RestUrl = // some url



  constructor(private service1: LogService, private httpClient: HttpClient,
    private interceptor: InterceptorService) {
     this.service1.logData.subscribe((val) => {

       this.storage.setItem("key", "value");
     });

   this.interceptor.ok$.subscribe((value) => {
      if (value === true) {
        this.getDataFromLocalStorage();
      }    
    });



  }

  getDataFromLocalStorage(): void {

    //getting data from the local storage and making rest call to server


  }


  pushDatatoServer(data: string) {

    this.httpClient.post(this.RestUrl, this.data, this.httpHeaderObjRequestParam )
      .subscribe((response) => {
        // do something

        }



  }





}
...