У нас есть приложение Angular6, где у нас есть разные компоненты на странице, и у каждого компонента есть <loader isLoading = {loading} /> для отображения загрузчика при вызове API. Но этот процесс выполняется вручную, для этого каждый компонент должен поддерживать флаг загрузки.
Я хочу, чтобы перехватчик справился с этим. Я написал код, но он работает частично правильно.
Поведение приложения
В моей реализации он продолжает показывать загрузчик до тех пор, пока не завершится каждый вызов API. (Ведение подсчета вызовов API)
Итак, как мне показать только те загрузчики, для которых вызов API еще не завершен, и скрыть те, для которых API завершен.
Реализация перехватчика
export class HttpCommonInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
this.loader.start();
this.loaderCount++;
return next.handle(req).pipe(
tap(event => {
if (event instanceof HttpResponse) {
this.loaderCount--;
if (this.loaderCount === 0) {
this.loader.stop();
}
return of(event);
}
}),
catchError(error => {
this.loader.stop();
this.loaderCount--;
console.info('Error caught in interceptor ', error);
return of(error);
})
);
}
}
@martin, что я хочу сказать, если api component1 завершается, тогда он должен скрыть загрузчик для component1, но должен отображать загрузчик других компонентов, поскольку другие api все еще не завершены.
Думаю, вам стоит связать это с Httpinterceptor. Beacuse Loading - это задача пользовательского интерфейса, которая не обязательно должна быть http-вызовом.
@FanCheung Вот как это в настоящее время реализовано. Пользовательский интерфейс управляет загрузчиком, и это только для HTTP-вызовов. Но везде захламлено. Итак, я думал об абстрагировании этой функциональности из пользовательского интерфейса, чтобы она была в одном месте.
это обычно доставляет вам больше проблем в долгосрочной перспективе. Загрузчик - это очень общий компонент. Вместо этого вы можете создать многоразовый компонент с загрузчиком в нем.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Операция внутри вашего перехватчика является асинхронной, поэтому, когда вы вызываете, например.
this.loader.stop(), и некоторые шаблоны считывают, что его значение не запускает обнаружение изменений, поэтому попробуйте обернутьthis.loader.stop()внутриNgZone.run(() => {...}).