2016-10-27 4 views
1

Ich möchte ein neues Teammitglied hinzufügen, wenn Teammitglied nicht in der Firebase-Datenbank vorhanden ist. Allerdings sehe ich beim Lesen der vorhandenen Einträge eine Zeitverzögerung. Der folgende Code gibt null für die Variable teammembertKey zurück. Daher sehe ich jedes Mal einen neuen Schlüssel in der Datenbank, wenn ich mich erneut im System anmelde. Kann mir jemand helfen, dieses Problem zu lösen?Zeitverzögerung in child_added Listener

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

Sie sind mit asynchronem Rückruf falsch zu tun, siehe https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call. Schnelle Lösung, setzen Sie all Ihren Code beginnend mit 'if (teammemberKey == null)' innerhalb 'child_added' Event-Funktion –

+0

ich kann es nicht tun, weil ich zum gleichen Knoten '/ Führer' hinzufügen – softsara

+1

okay, in diesem Fall denke ich Es wäre richtig, nicht "child_added", sondern "value" zu verwenden, da Sie nur den Wert überprüfen. 'ref.orderByChild ('email'). equalTo (firebase.auth(). currentUser.email) .once ('Wert', Funktion (Fang) {...})' und dann können Sie Ihr Update in die Callback-Funktion einfügen . –

Antwort

0

Hier ist, was Sie brauchen.

$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

Danke, nicht sicher, warum es in dem obigen Code nicht funktioniert – softsara

+0

snap.exists() immer True zurückgegeben – softsara

+0

hat es in snap.val() geändert –

Verwandte Themen