延迟旋转器拦截器 Angular

Delay spinner interceptor Angular

我为 http 请求制作了 spinner 拦截器。对于显示的每个 http 请求微调器。

但是有些网页请求速度比较快,这种情况下,spinner会变成网页中的闪烁。

我想为微调器做一些延迟,但我不知道怎么做。

微调组件

<ng-container *ngIf="loading$ | async">
<mat-progress-bar  mode="indeterminate" color='warn'>
</mat-progress-bar>

export class SpinnerComponent implements OnInit {
  loading$;

  constructor(private spinnerService: SpinnerService) { }

  ngOnInit() {
    this.loading$ = this.spinnerService.isLoading$
    .pipe(
     delay(0)
    );
  }

}

旋转器服务

export class SpinnerService {
isLoading$ = new Subject<boolean>();

show() {
    this.isLoading$.next(true);
}
hide() {
    this.isLoading$.next(false);
}

}

Spinner 拦截器

export class SpinnerInterceptor implements HttpInterceptor {
requestCount = 0;
constructor(private spinnerService: SpinnerService) { }

intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    this.requestCount++;
        this.spinnerService.show();

    return next.handle(request)
        .pipe(
            finalize(() => {
                this.requestCount--;
                if (this.requestCount === 0) {
                    this.spinnerService.hide();
                }
            })
        );
}

}

您可以在 hide() 函数中设置超时并在一段时间后执行代码 这是一个例子

     hide() {
       setTimeout( () => {     
        this.isLoading$.next(false);
       }, 2000 );
     }

还有其他几种方法可以实现,参考

您可以先在管道内使用 debounceTime rxjs 运算符,然后再使用 finalize 方法。 例如

    import { debounceTime } from 'rxjs/operators';

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    this.requestCount++;
        this.spinnerService.show();

     return next.handle(request)
            .pipe(
                debounceTime(1000),
                finalize(() => {
                    this.requestCount--;
                    if (this.requestCount === 0) {
                        this.spinnerService.hide();
                    }
                })
            );

答案:https://codeburst.io/rxjs-show-spinner-for-a-minimum-amount-of-time-807ac6b23227

此外,要实现相反的效果(如果请求很快则根本不显示)请查看 race 运算符。