AngularFireAuth 的 user 使用 toPromise() 沒有作用的問題。

最近在使用angularfire2(5.0.0-rc.11)firebase(5.3.1) 套件在Angular 6 上面的小問題。

簡單的說我透過Google Firebase Service提供的Cloud Database放了一個使用者的資料內容欄位為 email , nameavatar這三個欄位。接著API來跟Firebase的Cloud Database拿使用者料顯示在網頁上。


流程上:

1. 先拿到使用者的uuid
2. 然後再用firebase套件提供的api加上這個使用者的uid去向Cloud Database拿資料。(拿database的資料說明請看這邊)

在流程1 中我們透過 AngularFireAuth.user可以取得user相關資料,由於AngularFireAuth.user他會返回一個Observable<firebase.User>的物件,所以最簡單的作法就是在subscribe內取出user的uid 然後在把firebasedatabase的相關設定設定好程式碼如下:

this.afAuth.user.subscribe( user => { this.uuid = user.uid; this.database = this.db.database.ref('users/' + this.uuid); } );


  • this.afAuth  AngularFireAuth
  • this.database 是一個 firebase.database.Reference物件
  • this.db 是 AngularFireDatabase物件
不過由於我無聊想把他改成Promise跑跑看,所以就使用了RXJS的toPromise把Observable轉成Promise 如下:
this.afAuth.user.toPromise().then( user => console.log(user));

但是發現使用Promise的then方法卻沒有印user這個物件!於是上網查了一下原來這邊轉成Promise後由於AngularFireAuth並沒有觸發執行因此Promise也就無法解析到任何東西,所以只要在this.afAuth.user用first()觸發執行後再轉Promise就可以正常使用了。

this.afAuth.user.pipe(first()).toPromise().then( user => console.log(user));

  • first() 為rxjs的一個operators相關資訊可以參考這邊 "first()"


當然其實這樣做只是多"崖給"(台語),用subscribe就可以解決我要做的事情...... 嗯~所以只是我突然想要釐清的問題而已。😆




留言