Search code examples
javascriptnode.jsfirebasepromisees6-promise

Javascript Promises and Firebase


I want to execute a function CheckAndCreate() with a firebase function and execute a second function SendMessage() only when CheckAndCreate() has returned a key for a user ...

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");
    });
};

My problem is the understanding of Promises and the translation in Javascript. Can I execute what I want and How can I do that ?
Thank you.


Solution

  • You must return a promise from CheckAndCreate function. Learn how promises work. They will help you a lot while working in nodejs.

    I have shown below, the way your code should be structured to achieve what you want. I have also refactored some of your code, by taking advantage of chaining in promises. Which makes the code more readable.

    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
      });
    }