Требование :
Мне нужно показывать счетчик загрузки в пользовательском интерфейсе каждый раз, когда выполняется HTTP-запрос c.
Чтобы иметь приятный визуальный аспект, я решил показать счетчик на экране на минимум 1 секунду , даже если запрос длится меньше ( на самом деле длится от 0,1 до 3–4 минут, поэтому лучше удерживать спиннер не менее 1 секунды ). Итак, условия следующие:
- если запрос занимает меньше , чем 1 с, счетчик будет отображаться в течение 1 секунды
- , если запрос занимает дольше , чем 1 с, счетчик будет показывать, пока не закончится.
Я знаю, что этот подход может быть спорным с точки зрения UI / UX, но я предпочитаю рассматривать его как техническую проблему.
Код, который я пробовал:
Как было обнаружено в другой реализации SO, я пробовал подход с combineLatest
- объедините Observable, который принимает 1 с и Наблюдается для HTTP-запроса.
load() {
this.loading = true; // this will show the spinner
combineLatest(timer(1000), this.service.apiCall())
.pipe(
finalize(()=> {
this.loading = false; // this will hide the spinner
}),
map(x => x[1])
)
.subscribe(x => {
console.log(x);
});
}
Это хорошо работает, если HTTP-запрос возвращается со статусом 200.
Проблема:
Код выше не работает, если HTTP-запрос возвращает ошибку (4 / 5xx). Observables заканчивают sh сразу после завершения HTTP-запроса.
Я хочу, чтобы счетчик имел такое же поведение, даже если запрос завершился первым, с ошибкой.
Я сделал простой Stackblitz, в котором можно играть с разными запросами: https://stackblitz.com/edit/spinner-with-min-duration-zcp7hc
Спасибо!