簡體   English   中英

如何停止AngularFire2功能?

[英]How to stop AngularFire2 function?

我正在使用AngularFire2身份驗證。 一切正常。 現在我想要實現的是,檢查用戶是否已經在用戶列表中,然后在下次單擊facebook登錄按鈕時更新lastLogin。

否則創建一個新用戶。

這很好。 但是我無法停止updateLogin()/ _addUser()函數以在更新數據庫后停止。

它一直在繼續。 (89 ...)auth.service.ts:98已成功登錄!

這是updateLogin()

private _updateLogIn(thisurl, data) {
    return thisurl.update({ 
        lastLogIn: firebase.database.ServerValue.TIMESTAMP,
        avatar: data.photoURL
      }).then((success) => {
        console.log("successfully logged in!");
      }); ;
  }

我用authentication()函數稱其為:

login(provider: string) {
    this.af.auth.login({
      provider: this._getProvider(provider)
    }).then(
        (success) => {
       this.authenticate(success);
   })
   return;
  }

    authenticate(user: any): any {
         if(!user) {
          return {};
        } else {
        let data = user.auth.providerData[0];
        this.api_url = this.af.database.object(`${this.path}/${user.auth.uid}`);
         this._isUsers().subscribe(value => {
           var filtered =  value.filter(function(item) {
                return item.uid === user.auth.uid;
            });
            if(filtered.length > 0){this._updateLogIn(this.api_url, data); return; }
            else{ this._addUser(this.api_url, user, data); return;
               }
          });
         return;
        }
      }

 _isUsers(){
   return this.usersList.map(snapshot => {
         return snapshot;
     });
  }

private _addUser(thisurl, user, data){
    return thisurl.set({
          name: data.displayName,
          username: data.displayName.replace(/ /g,"."),
          avatar: data.photoURL,
          email: data.email,
          provider: data.providerId,
          uid: user.auth.uid,
          lastLogIn: firebase.database.ServerValue.TIMESTAMP
      }).then((success) => {
        console.log("successfully signed up!");
        return;
      }); 
 }

如何停止功能執行一次? 這基本上會破壞我的瀏覽器標簽。

(89 ...)auth.service.ts:98已成功登錄!

問題最像與_isUsers()返回的observable有關。 盡管不清楚問題的代碼,但該函數返回的this.usersList似乎是所有用戶的AngularFire2 list

每當數據庫更改時,AngularFire2 listobject可觀察object都會發出數據,因此在_updateLogIn設置用戶數據很可能會導致發出另一個用戶列表, _updateLogIn

要解決該問題,可以使用第first運算符:

import 'rxjs/add/operator/first';

this._isUsers().first().subscribe(...)

但是,尚不清楚為什么首先需要訂閱該可觀察項。 您可能要考慮重構問題中的代碼,因為它看起來過於復雜。

通常最好避免盡可能多的subscribe呼叫。 您可能需要閱讀RxJS:不要退訂

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM