Angular 角度5-服务未更新订阅的变量

Angular 角度5-服务未更新订阅的变量,angular,angular2-routing,angular5,angularfire2,angular-observable,Angular,Angular2 Routing,Angular5,Angularfire2,Angular Observable,我是个新手 我的web应用程序中有一个AuthService,它通过Angularfire2(firebase)对用户进行身份验证,并将电子邮件和标志(指示用户是否填写了配置文件数据表)插入firebase数据库 我的route guard检查用户是否经过身份验证,以及用户是否填写了配置文件数据表单。如果没有,我将重定向到配置文件数据表单。如果用户已经填写了表单,我将重新指向希望页面 我通过用户数据服务: constructor(private afd: AngularFireDatabas

我是个新手

我的web应用程序中有一个AuthService,它通过Angularfire2(firebase)对用户进行身份验证,并将电子邮件和标志(指示用户是否填写了配置文件数据表)插入firebase数据库

我的route guard检查用户是否经过身份验证,以及用户是否填写了配置文件数据表单。如果没有,我将重定向到配置文件数据表单。如果用户已经填写了表单,我将重新指向希望页面

我通过用户数据服务:

  constructor(private afd: AngularFireDatabase, private authService: AuthService) {

  }

  isProfileComplete (): Observable<any> {
    return this.afd.list(`/users/${this.authService.uid}`)
            .snapshotChanges()

  }
我认为代码没有到达可观察的映射部分来读取键profileComplete的值

有人能告诉我正确的方向吗


谢谢

您应该从
CanActivate
返回此类型的
Observable | Promise
。因为JavaScript不会等待回调。例如:

canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {

if (this.authService.isAuthenticated()) {
  console.log(this.usrData.isProfileComplete())
  return this.usrData.isProfileComplete()
    .map(userInfos => {
      console.log(userInfos)
      userInfos.forEach(item => {
        console.log(userInfos)
        if ((item.payload.key === 'profileComplete') && (item.payload.val() === true)) {
          console.log('user is logged in & data form completed')
          return of(true);
        } else if ((item.payload.key === 'profileComplete') && (item.payload.val() !== true)) {
          this.router.navigate(['data_form']);
          console.log('user logged in not completed the form')
          return of(false);
        }
      })

    })

} else {
  this.router.navigate(['login']);
  console.log('user is not logged in ')
  return of(false);
}
canActivate(路由:ActivatedRouteSnapshot,状态:RouterStateSnashot):可观察的|承诺|布尔值{
if(this.authService.isAuthenticated()){
console.log(this.usrData.isProfileComplete())
返回此.usrData.isProfileComplete()
.map(userInfos=>{
console.log(userInfos)
userInfos.forEach(项=>{
console.log(userInfos)
if((item.payload.key=='profileComplete')&&(item.payload.val()==true)){
console.log('用户已登录且数据表单已完成')
返回(真);
}否则如果((item.payload.key=='profileComplete')&&(item.payload.val()!==true)){
这个.router.navigate(['data_form']);
console.log('登录的用户未完成表单')
归还(假);
}
})
})
}否则{
this.router.navigate(['login']);
console.log('用户未登录')
归还(假);
}

}

以下内容是否返回一个可观察值

this.usrData.isProfileComplete()
不管怎样,您正在从forEach循环的上下文中返回true/false,这意味着outermap方法没有返回任何内容

你可能想考虑使用<代码>查找< /C>而不是一个前缀,然后你可以返回“<代码>查找< /COD>是否发现任何东西的结果:

return !!userInfos.find(item => (item.payload.key === 'profileComplete') 
                                && (item.payload.val() === true));

显然,这不会处理您想要返回表单的重定向情况,但应该为您指出正确的方向

嗨,克里斯,谢谢您的回复。不幸的是,运行时代码似乎没有到达项(!!userInfos.find(item=>)。我在返回的上方添加了一个console.log,没有输出。re:this.usrData.isProfileComplete()是的,它返回一个可观察到的,我也添加了代码。你还需要地图语句中的return关键字。太好了,谢谢你。嗨,Abylay,我做了你建议的更改,不幸的是,结果仍然是一样的。我想返回可观察到的,这个例子是一个线索。我看到你找到了一个解决方案,太好了!
return !!userInfos.find(item => (item.payload.key === 'profileComplete') 
                                && (item.payload.val() === true));