Как вернуть результат внутреннего наблюдаемого в преобразователе маршрутов 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()
    
  }
Другие вопросы по тегам