Angular 16+ Resolver запускается до завершения APP_INITIALIZER
Я сталкиваюсь со странным поведением при использовании angular V16 и нового разрешенияFN.
Если я вызываю страницу непосредственно из браузера (например, введя «localhost:4200/customer/123»), преобразователь выполняется ДО того, как APP_INITIALIZER завершит загрузку, и поэтому генерирует ошибку в моем преобразователе, поскольку не все загружаются.
Есть какие-нибудь подсказки по поводу этого странного поведения?
Провайдер:
{
provide: APP_INITIALIZER,
useFactory: (
injector: Injector) => {
return () => {
const dbService = injector.get(DbService);
return dbService.initialize();
};
},
deps: [Injector],
multi: true
}
Резольвер:
export const CustomerResolver: ResolveFn<ICustomer> =
(route: ActivatedRouteSnapshot,
state: RouterStateSnapshot,
customersService = inject(CustomersService),
errorsService = inject(ErrorsService),
) => {
let etag: string | null | undefined = "";
const customer_Id = route.paramMap.get('customer_Id');
if (customer_Id) {
return customersService.getById(customer_Id)
.pipe(
takeLast(1),
catchError(errorsService.catch),
);
}
return EMPTY;
}
Редактировать 1
Например, вы можете протестировать DbService следующим образом:
export class DbService {
public initialize(): Observable<boolean> {
console.log(`Start ServiceDb`);
const init = new Subject<boolean>();
setTimeout(() => {
init.next(true);
init.complete();
console.log(`End ServiceDb`);
}, 500);
return init;
}
}
И такой резольвер:
export const CustomerResolver: ResolveFn<ICustomer> =
(route: ActivatedRouteSnapshot,
state: RouterStateSnapshot
) => {
const customer_Id = route.paramMap.get('customer_Id');
console.log('customer resolver');
return EMPTY;
}
Вы увидите в консоли:
Запустить базу данных службы
решатель клиентов
Завершить службу базы данных
Как будто резолвер не дождался окончания инициализации