Angular-Interceptor: как управлять несколькими загрузчиками / счетчиками на странице

У нас есть приложение Angular6, где у нас есть разные компоненты на странице, и у каждого компонента есть <loader isLoading = {loading} /> для отображения загрузчика при вызове API. Но этот процесс выполняется вручную, для этого каждый компонент должен поддерживать флаг загрузки.

Я хочу, чтобы перехватчик справился с этим. Я написал код, но он работает частично правильно.

Поведение приложения

Angular-Interceptor: как управлять несколькими загрузчиками / счетчиками на странице

В моей реализации он продолжает показывать загрузчик до тех пор, пока не завершится каждый вызов 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);
            })
        );
    }
}

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

martin 27.11.2018 15:17

@martin, что я хочу сказать, если api component1 завершается, тогда он должен скрыть загрузчик для component1, но должен отображать загрузчик других компонентов, поскольку другие api все еще не завершены.

Ricky 27.11.2018 15:31

Думаю, вам стоит связать это с Httpinterceptor. Beacuse Loading - это задача пользовательского интерфейса, которая не обязательно должна быть http-вызовом.

Fan Cheung 27.11.2018 16:50

@FanCheung Вот как это в настоящее время реализовано. Пользовательский интерфейс управляет загрузчиком, и это только для HTTP-вызовов. Но везде захламлено. Итак, я думал об абстрагировании этой функциональности из пользовательского интерфейса, чтобы она была в одном месте.

Ricky 27.11.2018 16:54

это обычно доставляет вам больше проблем в долгосрочной перспективе. Загрузчик - это очень общий компонент. Вместо этого вы можете создать многоразовый компонент с загрузчиком в нем.

Fan Cheung 27.11.2018 17:00
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
5
1 572
0

Другие вопросы по теме