2016-10-27 8 views
1

チームメンバーがFirebaseデータベースに存在しない場合は、新しいチームメンバーを追加します。しかし、私は既存のエントリを読んでいる間に時間の遅れを見る。以下のコードは、変数teammembertKeyに対してnullを返します。したがって、システムに再ログインするたびにデータベースに新しい鍵が表示されます。誰かが私にこの問題を解決するのを助けることができますか?child_addedリスナーの遅延時間

checkIfUserExists = function (teammemberData) { 
      return firebase.database().ref().child('/leaders/' + firebase.auth().currentUser.uid) 
       .once("value", function (snapshot) { 
        console.log(snapshot.exists()); 
       return Promise.resolve({ 
        teammemberData, 
        userExists: snapshot.exists(), 
       }); 
      }); 
     }; 

     $scope.submit = function() { 
      var teammembertKey = null; 
      // A teammember entry. 

      // A teammember entry. 
      var teammemberData = { 
       uid: firebase.auth().currentUser.uid, 
       email: firebase.auth().currentUser.email, 
       displayName: firebase.auth().currentUser.displayName, 
       photoURL: firebase.auth().currentUser.photoURL 
      }; 
      const p = checkIfUserExists(teammemberData); 

      p.then((snapshot, userExists) => { 
       if (userExists) { 
        teammembertKey = snapshot.key; 
        // update user 
       } else { 
        // go create a user 
        console.log('i'); 
       } 
      }) 
      .catch(err => { 
       console.warn('Error signing in.', err); 
      }); 

      if (teammembertKey == null) { 
       // Get a key for a new team member. 
       teammembertKey = firebase.auth().currentUser.uid; //firebase.database().ref().push().key; 
       // Write the new member's data simultaneously. 
       var updates = {}; 

       updates['/leaders/' + teammembertKey] = teammemberData; 
       const promise = firebase.database().ref().update(updates); 
       promise 
       .then(e => { }) 
       .catch(e => { 
        console.log(e); 
       }) 
      } 

     }; 
+0

あなたはhttps://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-callを参照して、非同期コールバックで間違って扱っています。クイックソリューションは、 'child_added'イベント関数内で' if(teammembertKey == null) 'から始まるすべてのコードを入れてください –

+0

私は同じノード/ leaderに追加しているのでできません – softsara

+1

大丈夫です。値をチェックしているだけで 'child_added'を使わず、' value'を使うのは正しいでしょう。 'ref.orderByChild( 'email')。equalTo(firebase.auth()。currentUser.email).once( 'value'、function(snap){...})'そして、あなたの更新をコールバック関数の中に入れることができます。 –

答えて

0

ここが必要です。

$scope.submit = function() { 
     var teammembertKey = firebase.auth().currentUser.uid; 

     var teammemberData = { 
      uid: firebase.auth().currentUser.uid, 
      email: firebase.auth().currentUser.email, 
      displayName: firebase.auth().currentUser.displayName, 
      photoURL: firebase.auth().currentUser.photoURL 
     }; 

     firebase.database().ref().child('/leaders/' + teammembertKey).once("value") 
       .then(funciton(snap) { 
        if(!snap.val()) { 
          var updates = {}; 

          updates['/leaders/' + teammembertKey] = teammemberData; 
          const promise = firebase.database().ref().update(updates); 
          promise 
          .then(e => { }) 
          .catch(e => { 
           console.log(e); 
          }) 

        } 
       }) 
     .catch(err => { 
      console.warn('Error signing in.', err); 
     }); 
    }; 
+0

なぜ、上記のコードではうまくいかなかったのか分かりません – softsara

+0

snap.exists()は常にtrueを返します – softsara

+0

はsnap.val() –

関連する問題