如果在 1 秒内没有响应,如何添加到数组? [英] How to add to array if no response during 1 second?
本文介绍了如果在 1 秒内没有响应,如何添加到数组?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个侦听请求/响应的拦截器.
I have an intercept that listens requests/responses.
我尝试仅在请求超过 1 秒时才运行微调器:
I have tried to run spinner only if requests comes more then 1 seconds:
@Injectable()
export class LoadingInterceptor implements HttpInterceptor {
private requests: HttpRequest<any>[] = [];
constructor(private spinnerService: SpinnerService) {}
intercept(
req: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
this.requests.push(req);
this.spinnerService.isLoading.next(true);
return new Observable((observer) => {
next.handle(req).subscribe(
(event) => {
if (event instanceof HttpResponse) {
this.removeRequest(req);
observer.next(event);
}
},
() => {
this.removeRequest(req);
},
() => {
this.removeRequest(req);
}
);
});
}
private removeRequest(request: HttpRequest<any>) {
const index = this.requests.indexOf(request);
if (index >= 0) {
this.requests.splice(index, 1);
}
this.spinnerService.loadingStop.next();
this.spinnerService.loadingStop.complete();
this.spinnerService.isLoading.next(this.requests.length > 0);
}
}
Spinner 服务是:
Spinner service is:
constructor() {
this.isLoading
.pipe(debounceTime(100), delay(1000), takeUntil(this.loadingStop))
.subscribe((status: boolean) => (this.loadingStatus = status));
}
为此,我添加了这个:
.pipe(debounceTime(100), delay(1000), takeUntil(this.loadingStop))
但它对我不起作用...如果响应超过 1 秒,如何显示微调器?
But it does not work for me...How to show spinner if response comes more 1 second?
推荐答案
使用 iif 运算符立即停止加载.
Uses the iif operator to stop loading instantly.
拦截器应该是这样的:
constructor(private spinnerService: SpinnerService) { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.spinnerService.start(request.url);
return next.handle(request).pipe(
finalize(() => () => this.spinnerService.stop(request.url))
);
}
这是加载服务:
@Injectable()
export class SpinnerService {
private _loading: BehaviorSubject<boolean>;
private _request: Set<string>;
private _delayTime: number;
constructor() {
this._loading = new BehaviorSubject(false);
this._request = new Set();
this._delayTime = 1000;
}
isLoading(time?: number): Observable<boolean> {
return this._loading.asObservable().pipe(
// uses switchMap to cancel the previous event
switchMap(isLoading =>
// use iif to put delay only for true value
iif(
() => isLoading,
of(isLoading).pipe(
delay(time !== undefined ? time : this._delayTime),
),
of(isLoading),
),
),
);
}
start(request: string = 'default', delayTime?: number): void {
if (delayTime !== undefined)
this._delayTime = delayTime;
this._request.add(request);
this._loading.next(true);
}
stop(request: string = 'default'): void {
this._request.delete(request);
if (!this._request.size)
this._loading.next(false);
}
}
所以它应该在模板中查看
and so it should look in the template
@Component({
selector: 'my-app',
template: `<div *ngIf="isLoading$ | async">loading...</div>`,
})
export class AppComponent {
isLoading$: Observable<boolean>;
constructor(private spinnerService: SpinnerService) {
this.isLoading$ = this.spinnerService.isLoading();
}
}
这篇关于如果在 1 秒内没有响应,如何添加到数组?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文