0

我正在玩Angular2中的Firebase,我被卡在訪問this承諾。訪問此Firebase Angular2承諾

這是我的腳本。對於上下文的理解:在登錄時,我想檢查與該用戶相關的數據庫中的基本數據仍然是最新的。

import { Injectable, Inject } from '@angular/core'; 
import { AngularFire, AuthProviders, FirebaseAuthState, FirebaseApp } from 'angularfire2'; 

@Injectable() 
export class AuthService { 
    user; 
    userUID; 
    userEmail; 
    isAuthenticated: boolean = false; 

constructor(public af: AngularFire, @Inject(FirebaseApp) firebaseApp: firebase.app.App) { 
    this.af.auth.subscribe(authState => { 
     if (authState && !authState.auth.isAnonymous) { 
     this.user = authState; 
     this.isAuthenticated = true; 
     this.userEmail = this.user.auth.email; 
     this.userUID = this.user.auth.uid; 

     firebaseApp.database().ref('/users/' + this.userUID).once('value').then(function(snapshot) { 
     if (snapshot.val().email !== this.userEmail) { //ERROR HERE 
      console.log('update the email in database here'); 
     } 
     }); 

     console.log('User Logged in', this.user, this.userEmail, this.userUID); 
     return; 
    } 

    this.logout(); 
    console.log('User Not Authenticated', this.user); 
}); 
} 

錯誤當然在這裏我想這樣做比較行:

if (snapshot.val().email !== this.userEmail) 

我在JavaScript知道/打字稿是很煩人的,我不能找到一個辦法讓我的腳本工作。

回答

1

如果你用一個箭頭的功能將保留什麼this

firebaseApp.database().ref('/users/' + this.userUID).once('value').then((snapshot) => { 
    if (snapshot.val().email !== this.userEmail) { 
     console.log('update the email in database here'); 
    } 
}); 
+0

感謝它按預期工作......必須在我的打字技能。 – BlackHoleGalaxy

1

JavaScript標準竅門來解決,這是節省this到一個變量事先,然後使用它,通常let self = this。 在TypeScript中,當您使用胖箭頭功能時,該語言會爲您執行此操作。編譯的JavaScript代碼將具有常規功能,但將在函數內部使用名爲_this的變量,該變量事先被初始化爲this,而不是this。 總之,而不是寫作function (param) { // code },使用(param) => { // code }