1
0
Files
yel-dspace-angular/src/app/core/lazy-service.ts
2024-03-12 20:10:23 +01:00

41 lines
1.1 KiB
TypeScript

import {
Injector,
Type,
} from '@angular/core';
import {
defer,
Observable,
} from 'rxjs';
/**
* Loads a service lazily. The service is loaded when the observable is subscribed to.
*
* @param loader A function that returns a promise of the service to load.
* @param injector The injector to use to load the service. If not provided, the current injector is used.
* @returns An observable of the service.
*
* @example
* ```ts
* const dataService$ = lazyService(() => import('./data-service').then((m) => m.MyService), this.injector);
* or
* const dataService$ = lazyService(() => import('./data-service'), this.injector);
* ```
*/
export function lazyService<T>(
loader: () => Promise<Type<T>> | Promise<{ default: Type<T> }>,
injector: Injector,
): Observable<T> {
return defer(() => {
return loader()
.then((serviceOrDefault) => {
if ('default' in serviceOrDefault) {
return injector!.get(serviceOrDefault.default);
}
return injector!.get(serviceOrDefault);
})
.catch((error) => {
throw error;
});
});
}