0

私はAngularFire2認証を使用しています。すべて正常に動作しています。今私が達成したいのは、ユーザーがすでにユーザーリストに入っていることを確認し、次回フェイスブックログインボタンをクリックしたときにlastLoginを更新することだけです。AngularFire2の機能を停止するには?

これ以外の新しいユーザーを作成します。

これは問題なく動作します。しかし、データベースの更新後に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!"); 
     }); ; 
    } 

私は次のように認証()関数でこれを呼び出す:

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 successfully logged in!

+0

あなたは '_isUsers'と' _addUser'の実装も含めるべきです。 – cartant

+0

私はそれを追加しました! –

+0

そこには 'createUser'もありません。あなたの質問に[mcve]を含めるか、関連するコードをすべて含めるようにしてください。 – cartant

答えて

0

問題は、_isUsers()によって返された観察可能性に最も似ています。問題のコードからは明らかではありませんが、その関数によって返されたthis.usersListはすべてのユーザーのAngularFire2 listです。この問題を解決するためになど、

AngularFire2 listobject観測がいつでもデータベースの変更データを発するので、それはあなたが放出されているユーザーの別のリストに_updateLogIn結果内のユーザデータを設定している可能性があります、あなたが使用することができますfirstオペレータは:あなたが最初の場所でその観測可能に加入する必要がある理由

import 'rxjs/add/operator/first'; 

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

しかし、それは明らかではありません。あなたの質問のコードをリファクタリングすることは、過度に複雑に思えるかもしれません。

可能な限り多くのsubscribeコールを避けることは、一般的には良い考えです。 RxJS: Don’t Unsubscribeと読んでみてください。

関連する問題