Как вернуть результат внутреннего наблюдаемого в преобразователе маршрутов Angular
Я пытаюсь написать что-то вроде простого метода для получения данных профиля пользователя для моего приложения Angular и загрузки этих данных перед переходом на страницу профиля с помощью преобразователя. . Решатель не завершает работу, хотя ошибок нет. Это мой код для класса преобразователя:
export class ProfileResolverService implements Resolve<Observable<any>> {
constructor(private fs: FirestoreService, private auth:AuthService) { }
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
return this.auth.user.pipe(take(1),
mergeMap(userdata => {
return this.fs.getUserProfile(userdata.uid) //get user profile returns Observable<unknown[]>
})
)
}
}
и в моем модуле маршрутизации:
path: 'profile',
children: [
{
path: '',
resolve: {
userdata: ProfileResolverService
},
loadChildren: () => import('../profile/profile.module').then( m => m.ProfilePageModule)
}
Может ли кто-нибудь помочь. Был на этом 2 дня
3 ответа
Нашел там проблему:
export class ProfileResolverService implements Resolve<Observable<any>> {
constructor(private fs: FirestoreService, private auth:AuthService) { }
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
return this.auth.user.pipe(take(1),
mergeMap(userdata => {
return this.fs.getUserProfile(userdata.uid).pipe(take(1),map(user => user)); //had to map the output of the observable and then fetch it in my rout resolver
})
)
}
}```
So my resolver now looks like this:
путь: 'profile', дочерние элементы: [ { path: '', resolve: { user: ProfileResolverService \get user вместо userdata }, loadChildren: () => import('../profile/profile.module'). затем ( m => m.ProfilePageModule) }
Причин могло быть 2:
this.auth.user
не испускает никакого значенияthis.fs.getUserProfile(userdata.uid)
не завершается
Попробуйте это, чтобы узнать, есть ли у вас журналы:
return this.auth.user.pipe(
take(1),
mergeMap(userdata => {
console.log('userdata: ', userdata);
return this.fs.getUserProfile(userdata.uid).pipe(
tap(profile => console.log('profile: ', profile));
finalize(() => console.log('getUserProfile complete or error'));
)
})
)
Если ваш код в порядке, вы должны хотя бы иметь журнал userdata и getUserProfile.
У меня была точно такая же проблема. Похоже, вы должны подписаться на наблюдаемое, чтобы преобразователь разрешил.
Итак, в вашем случае это должно выглядеть так:
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot){
return this.auth.user.pipe(take(1),
mergeMap(userdata => {
return this.fs.getUserProfile(userdata.uid) //get user profile returns Observable<unknown[]>
})
).subscribe()
}