处理来自Firebase的注销,而不会收到权限错误

6 firebase firebase-authentication firebase-realtime-database angularfire2

在我的Angular/Firebase应用程序中,我有一个支持登录和注销的用户服务.登录后,我从Angular数据库中检索用户的特定于应用程序的数据.该服务发布一个appUser$包含当前用户对象的可观察对象(或者null,如果没有人登录).事情看起来像这样.switchMap当用户登录并退出时,我正在使用不同的observable切换我的应用程序的用户数据.

constructor( 
  private angularFireAuth: AngularFireAuth,
  private angularFireDatabase: AngularFireDatabase
) {
   this.appUser$ = this.angularFireAuth.authState
     .map(user => user && user.uid)
     .switchMap(uid => uid ? this.angularFireDatabase.object(`/users/${uid}`) : 
       Observable.of(null);
}

signOut() { return this.angularFireAuth.auth.signOut(); }
Run Code Online (Sandbox Code Playgroud)

这样做的问题是即时签出发生,访问/users数据库中节点的权限丢失,生成权限被拒绝的运行时错误.为了解决这个问题,我尝试Subject为Angular 创建自己的,User并在调用之前将其归零signOut.我认为这会触发switchMap并以某种方式取消先前用户的应用数据可观察的待处理对象,从而防止权限被拒绝错误.

user$: Subject;

constructor( 
  private angularFireAuth: AngularFireAuth,
  private angularFireDatabase: AngularFireDatabase
) {
   this.angularFireAuth.authState.subscribe(this.user$);

   this.appUuser$ = this.user$
     .map(user => user || user.uid)
     .switchMap(uid => uid ? this.angularFireDatabase.object(`/users/${uid}`) : 
       Observable.of(null);
}

signOut() { 
  this.user$.next(null);
  return this.angularFireAuth.auth.signOut(); 
}
Run Code Online (Sandbox Code Playgroud)

但即使我延迟拨打电话,相同的许可问题仍然存在signOut.似乎不知何故,this.angularFireDatabase.object即使switchMap应该切换到之后,创建的observable 仍然"活着" Observable.of(null),而Firebase仍然不满意失去访问它的权限.

我可以以某种方式陷阱或抑制此错误,但是有一些简单的方法来处理这种情况吗?