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

Synchronize changes of service variable that changes in time angular 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,然后变为false,这一切在5秒的时间段内花费了剩余的API来带数据。

加载变量最初与加载变量同步为false,但后来不跟随加载变量的状态,加载变量保持为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 class.

上提到的 public 变量 'loading'
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文件中创建了classes,这样它更有秩序,一个class负责拦截逻辑,另一个class 负责监听 http 请求,我检查了很多解决方案,但这是我最喜欢的一个,因为它 returns 对 html 是对还是错而不需要使用依赖项.

这是你使用的服务的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 中

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