2017-07-21 28 views
3

我在這裏使用了AngularFire2版本的代碼,我用它從我的組件之一的數據庫中獲取一些成員。AngularFire2取消訂閱註銷,未註冊訂閱時出現數據庫權限錯誤

我在同一個組件中調用此註銷時遇到問題。我取消訂閱訂閱,但我仍然在控制檯中發現錯誤Exception was thrown by user callback. Error: permission_denied at /users/uid。我知道這是因爲我不再登錄,我的數據庫規則不允許這個讀取操作。我不知道爲什麼如果我已經取消訂閱,它仍然試圖讀取數據。

constructor(private afAuth: AngularFireAuth, private db: AngularFireDatabase) { 
     this.user = afAuth.authState; 

     this.userSub = this.user.subscribe(auth => { 
      if (auth) { 
       this.member = db.object('/users/' + auth.uid); 
       this.dbSub = this.member.subscribe(); 
      } 
     }); 
    } 

    logout() { 
     this.dbSub.unsubscribe(); 
     this.userSub.unsubscribe(); 

     this.afAuth.auth.signOut() 
      .then(() => this.router.navigateByUrl('/login')); 
    } 
+0

也許你正在模板中的某處使用'async'管道的observable?如果你是,那將是另一個訂閱。 – cartant

+0

不應該自動取消訂閱 – user1738539

+0

是的,當組件被銷燬等,但不僅僅是因爲你調用你的註銷方法。您的問題中沒有足夠的信息可以回覆。 – cartant

回答

3

也許你可以嘗試將signOut()使用RxJS主題與運營商一起takeUntil(),以幫助確保觀察到被清除之前:

import { Subject } from 'rxjs/Subject'; 
import 'rxjs/add/operator/takeUntil'; 

export class Foo { 
    private ngUnsubscribe: Subject<void> = new Subject<void>(); 

    constructor(private afAuth: AngularFireAuth, private db: AngularFireDatabase) { 
     this.user = afAuth.authState; 

     this.userSub = this.user.subscribe(auth => { 
      if (auth) { 
       this.member = db.object('/users/' + auth.uid); 

       this.dbSub = this.member 
        .takeUntil(ngUnsubscribe) 
        .subscribe(results => console.log(results)); 
      } 
     }); 
    } 

    logout() { 
     this.ngUnsubscribe.next(); 
     this.ngUnsubscribe.complete(); 

     this.userSub.unsubscribe(); 

     this.afAuth.auth.signOut() 
      .then(() => this.router.navigateByUrl('/login')); 
    } 
} 

希望幫助!