Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular Firebase:页面刷新后无法获取当前用户_Angular_Firebase_Firebase Authentication - Fatal编程技术网

Angular Firebase:页面刷新后无法获取当前用户

Angular Firebase:页面刷新后无法获取当前用户,angular,firebase,firebase-authentication,Angular,Firebase,Firebase Authentication,我试图在Firestore中检索一个文档,其中包含游戏当前用户(玩家)的数据;我能够获取文档,但是只要我刷新页面,firebase.auth().currentUser就会变为空。如果有区别,用户将匿名登录。我试图改变这种坚持,但似乎什么都没有改变 在my gameService.ts文件中: private getCurrentPlayer(gameId: string){ return this.afs.doc(`games/${gameId}/players/${firebase.

我试图在Firestore中检索一个文档,其中包含游戏当前用户(玩家)的数据;我能够获取文档,但是只要我刷新页面,
firebase.auth().currentUser
就会变为空。如果有区别,用户将匿名登录。我试图改变这种坚持,但似乎什么都没有改变

在my gameService.ts文件中:

private getCurrentPlayer(gameId: string){
    return this.afs.doc(`games/${gameId}/players/${firebase.auth().currentUser.uid}`);
}
在my component.ts文件中:

constructor(private gameService: GameService, private route: ActivatedRoute) 
{
    gameService.currentPlayer.valueChanges().subscribe(user =>{
      console.log(user)
      this.currentPlayer = user;
    });   
}


任何帮助都将不胜感激。谢谢

必须使用localStorage进行持久性存储:

localStorage.setItem('user', user)
然后,如果您想使用用户obj,您可以这样做

myUser = localStorage.getItem('user')
这样写:

return this.angularFireAuth.authState
  .pipe(
    filter(user => !!user),
    switchmap(user => this.afs.doc(`games/${gameId}/players/${user.uid}`));

observable可以在任何时候设置,包括在构造函数中,但在有可识别的用户之前不会触发,此时,它将为该用户提供所需的文档。

请记住,
currentUser
不会在应用程序刷新后启动并开始构建准备启动的内容时进行设置。只有在时钟经过几次滴答声后才会设置,在此期间Firebase会发现有人登录并进行处理。您的代码需要考虑这种延迟。例如,您可能希望将代码从构造函数中移到一个在
ngOnInit
中触发的方法中,就像一个例子一样。@torazaburo感谢我创建了一个sleep方法来延迟调用
getCurrentPlayer()
,这个方法很有效,但是这种方法看起来有点草率。有没有更好的方法来实现这一点?谢谢