Search code examples
javascriptfirebasefirebase-realtime-databasees6-promise

Promise in JavaScript still executes code synchronously


function loadTables() {
  refReview.on("value", function(snap) {
    var data = snap.val();
    var file11 = "";


    for (var key in data) {
      console.log("keys retrieved", data[key].revieweeID);

      var idOfReviewee = data[key].revieweeID;


      var promise = getData(idOfReviewee);
      promise.then(function(returnedFnLn) {
        console.log(returnedFnLn);
      });
      console.log("yeah");
    } //end of for loop

  });
}

why does it executes the console.log("yeah") when promise.then is not yet done?

function getData(idRev) {
  return new Promise(function(resolve, reject) {
    getDataToUsers = firebase.database().ref("users").child(idRev);
    getDataToUsers.once("value", function(snap) {
      var fnLn = snap.val();
      var first = fnLn.firstname;
      var second = fnLn.lastname;
      forPromiseFnLn = first.concat(second);

      resolve(forPromiseFnLn);
    });
  });
}

Output of console should be

keys retrieved: ,
(firstname and lastname retrieved),
yeah

But instead gives

keys retrieved ,
yeah,
(firstname and lastname retrieved)

Solution

  • That's what async stands for.

    Whyle your data get's fetched, javascript continues to execute the rest of your script. And since your console.log("yeah") ist not part of your promise, it's being executed before the data has been fetched.

    Either you have to do it sync (what's not good if you try to fetch data) or you can move your console.log() inside your promise.then() function.