同步随时间角度10变化的服务变量的变化

问题描述

我正在尝试在Angular 10中使用以下服务,该服务用于查找正在进行的HTTP请求,如果有HTTP请求,则该服务从true更改为false,这样做很好,我检查它与控制台日志

export class SpinnerService implements HttpInterceptor {

  public loading: boolean = false;
  
  constructor() {}

  intercept(req: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>> {
    this.loading = true;
    // console.log('estado spinner: >> ',this.loading);
    return next.handle(req).pipe(
      finalize(() => {
        this.loading = false; 
        // console.log('todas solicitudes ok');
        console.log('estado espinner: >>',this.loading);
      })
    );
  }
}

当我尝试在另一个组件中使用该服务时,我遇到了问题,因为该服务未与该组件的本地变量同步。 例如,服务的加载变量开始为false,然后变为true,然后在5秒钟的时间内变为false,这需要花费API的其余部分来带来数据。

load变量最初与load变量同步为false,但随后不跟随load变量的状态,因此load变量保持为false

如何同步这些变量?请帮忙,我不知道如何搜索

这是构造函数,我从加载变量中调用服务

public carga = this._spinnerService.loading;
    
constructor(private _spinnerService: SpinnerService) 
{
  this.crearFormulario();  // inicializar formulario
  // this._spinnerService.loading = this.spinneres;
  // console.log('estado inicial spinner: >>',this._spinnerService.loading);
  console.log('estado inicial spinner: >>',this.carga);
} 

解决方法

我认为您要展示的是对您的应用程序进行的每个http网络调用的微调。如果是这种情况,除了您在SpinnerService类上提到的公共变量“加载”之外,您几乎是正确的。

import { NgxSpinnerService } from 'ngx-spinner';
export class SpinnerService implements HttpInterceptor{
            
    constructor(private spinner: NgxSpinnerService) { }

    intercept(req: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>> 
    {
        this.spinner.show();
        return next.handle(req).pipe(
            finalize(() => {
                        this.spinner.hide();
                    }
            )
    );
    }
}

请安装

npm i ngx-spinner

在您app.component.ts

<ngx-spinner></ngx-spinner>

请参考:

https://www.npmjs.com/package/ngx-spinner

,

我能够解决问题,我在同一个ts文件中创建了类,以使它们更加有序,一个类负责拦截逻辑,另一个类负责侦听http请求,我检查了许多解决方案,但这是我最喜欢的解决方案,因为它无需使用依赖项即可将html返回true或false。

这是您使用的服务的ts文件,只需要将服务导入要使用微调器的组件中即可。

import { Injectable } from '@angular/core';
import { HttpInterceptor,HttpRequest,HttpHandler,HttpEvent,HttpResponse,HttpErrorResponse } from '@angular/common/http';//para interceptor de http
import { BehaviorSubject,Observable } from 'rxjs';//para interceptor de http
import { tap } from 'rxjs/operators';//para interceptor de http


@Injectable({
  providedIn: 'root'
})

//servicio interceptor que escucha si hay solicitudes http en progreso
export class interceptHttpService implements HttpInterceptor{

  constructor(private _pruebaspinerss3 : spinnerService ) { }
  
  intercept(request: HttpRequest<any>,next: HttpHandler): Observable<HttpEvent<any>> 
  {    
    this._pruebaspinerss3.requestStarted();    
    return this.handler(next,request);
  }

  handler(next,request)
  {
    return next.handle(request)
      .pipe(
          tap(
            (event) =>{
              if (event instanceof HttpResponse){
                this._pruebaspinerss3.requestEnded();  
              }
            },(error: HttpErrorResponse) =>{
              this._pruebaspinerss3.resetSpinner();
              throw error;
            }
          ),)
  };
}

export class spinnerService{
  
  private count = 0;
  private spinner$ = new BehaviorSubject<string>('');
  
  getSpinnerObserver(): Observable<string>{
    return this.spinner$.asObservable();
  }  

  requestStarted() {
    console.log('spinner activado');   
    if (++this.count === 1) {
      this.spinner$.next('start');
    }
  }

  requestEnded() {
    console.log('spinner desactivado');   
    if (this.count === 0 || --this.count === 0) {
      this.spinner$.next('stop');
    }
  }

  resetSpinner() {
    console.log('error en solicitud,reset spinner');
    this.count = 0;
    this.spinner$.next('stop');
  }
}

在app.module ts文件中

import { interceptHttpService,spinnerService } from './services/spinner.service';