2017-12-11 2 views
0

Ich möchte eine Funktion CheckAndCreate() mit einer Feuerbasis Funktion auszuführen und eine zweite Funktion Sendmessage() nur ausgeführt werden, wenn CheckAndCreate() hat einen Schlüssel für einen Benutzer zurückgegeben ...Javascript Versprechen und Firebase

var checkAndCreate = (sessionId, fbid, prenom, nom, genre) => { 
    var userz = firebase.database().ref().child("accounts").orderByChild("fbid").equalTo(fbid).once("value").then(function(snapshot) { 
     var exists = (snapshot.val() !== null); 
     if (exists) { 
      for (var key in snapshot.val()) break; 
      console.log("ouiii jexiste" + key); 
      sessions[sessionId].key = key; 
      // I have the key we can continue 
      snapshot.forEach(function(childSnapshot) { 
       console.log('snapshot.dernier_message'+childSnapshot.val().dernier_message); 
       sessions[sessionId].dernier_message = childSnapshot.val().dernier_message; 
      }); 

     } 
     else { 
      admin.auth().createCustomToken(fbid).then(function(customToken) { 
       firebase.auth().signInWithCustomToken(customToken).then(function() { 
        var user2 = firebase.auth().currentUser; 
        var keyid = firebase.database().ref().child('accounts').push(); 
        sessions[sessionId].key = keyid.key; 
        // I have the key we can continue 
        sessions[sessionId].dernier_message = new Date(); 
        firebase.database().ref().child('accounts').child(keyid.key).set({ 
         fbid: fbid, 
         prenom: prenom, 
         nom: nom, 
         nb_agression : 0, 
         dernier_message : new Date(), 
         genre: genre, 
         date: new Date().toISOString() 
        }).catch(function(error) { 
         console.log("erreur from firebas 9"); 
        }); 
       }).catch(function(error) { 
        console.log("erreur from firebas 10"); 
       }); 
      }).catch(function(error) { 
       console.log("erreur from firebas 11"); 
      }); 
     } // fin 
    }).catch(function(error) { 
     console.log("erreur from firebas 8 once"); 
    }); 
}; 

Mein Problem ist das Verständnis von Promises und die Übersetzung in Javascript. Kann ich ausführen, was ich will und wie kann ich das tun?
Danke.

+0

Gibt es ein spezifisches Problem mit dem Code, den Sie gezeigt haben? –

+0

gar nicht! Mein einziges Problem ist eigentlich, ich führe die zweite Funktion ohne Benutzerschlüssel aus, da Firebase async ist. Ich muss auf den Benutzerschlüssel warten –

Antwort

1

Sie müssen ein Versprechen von CheckAndCreate Funktion zurückgeben. Erfahren Sie, wie Versprechen funktionieren. Sie werden Ihnen bei der Arbeit in Nodejs sehr helfen.

Ich habe unten gezeigt, wie Ihr Code strukturiert sein sollte, um zu erreichen, was Sie wollen. Ich habe auch etwas von deinem Code überarbeitet, indem ich die Verkettung von Versprechungen ausnutze. Das macht den Code lesbarer.

var checkAndCreate =() => { 
    return new Promise((resolve, reject) => { 
    admin.auth().createCustomToken(fbid) 
    .then((customToken) => firebase.auth().signInWithCustomToken(customToken)) 
    .then(() => { 
      var user2 = firebase.auth().currentUser; 
      var keyid = firebase.database().ref().child('accounts').push(); 
      sessions[sessionId].key = keyid.key; 
      // I have the key we can continue 
      sessions[sessionId].dernier_message = new Date(); 
      firebase.database().ref().child('accounts').child(keyid.key).set({ 
       fbid: fbid, 
       prenom: prenom, 
       nom: nom, 
       nb_agression : 0, 
       dernier_message : new Date(), 
       genre: genre, 
       date: new Date().toISOString() 
      }); 
      resolve('some data you want to pass to SendMessage'); 
     }) 
     .catch((error) => { 
      console.log("erreur from firebas 10"); 
      reject(error) 
     }); 
    }); 
} 

var SendMessage =() => { 
    checkAndCreate() 
    .then((result) => { 
    // Send message based on result 
    }) 
    .catch((err) => { 
    // Do not send message 
    }); 
}