【发布时间】:2019-06-18 16:36:14
【问题描述】:
我在我的 Angular 项目中使用 HTTP 拦截器显示加载栏,每当 HTTP 请求发送到服务时,它都会显示加载器。
loader.service.ts
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class LoaderService {
isLoading = new Subject<boolean>();
constructor() { }
show() {
this.isLoading.next(true);
}
hide() {
this.isLoading.next(false);
}
}
loader-interceptor.ts
import { Injectable } from '@angular/core';
import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from '@angular/common/http';
import { Observable } from 'rxjs';
import { finalize } from 'rxjs/operators';
import { LoaderService } from '../services/loader.service';
@Injectable()
export class LoaderInterceptorService implements HttpInterceptor {
constructor(private loaderService: LoaderService) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.loaderService.show();
return next.handle(request).pipe( finalize( () => this.loaderService.hide()) );
}
}
问题是加载器在数据加载之前隐藏。尤其是在有大量数据的情况下会发生这种情况。我希望加载程序不要隐藏,除非所有请求都已解决,否则用户无法与表单等交互,除非数据已加载。加载器 HTML 使用覆盖 CSS 来阻止用户与表单交互,直到数据到达。
在另一个项目中,当我订阅每个组件中的服务方法时,我曾经在服务调用中调用这些隐藏/显示方法。我想避免这种情况,因为这需要我在每个组件中一次又一次地添加此代码。
这个问题有什么解决办法吗?
PS: 当不同组件同时存在多个 HTTP 请求时,处理 loader 是否有问题?
【问题讨论】:
-
奇怪,这应该可以。你可以试试“return next.handle(request).pipe(tap((event: HttpEvent
) => { if (event instanceof HttpResponse) { this.loaderService.hide(); } );”跨度> -
@riorudo。我会检查这个。我想知道问题的原因。
-
似乎您将加载程序隐藏在请求本身中,应该指定拦截响应
标签: angular