import { Observable, Subject, defer } from 'rxjs';import { finalize } from 'rxjs/operators';/** * @param subject$ - Subject для управления состоянием загрузки */function indicate<T>(subject$: Subject<boolean>) { // Возвращаем функцию, которая принимает исходный поток (source) return (source: Observable<T>): Observable<T> => // defer выполняет subject$.next(true) ровно в момент подписки defer(() => { subject$.next(true); // finalize сработает при complete или error return source.pipe(finalize(() => subject$.next(false))); });}
defer гарантирует, что next(true) выполнится на каждую подписку (а не один раз при создании оператора), а finalize — общий выход для успешного завершения, ошибки и отписки.