Skip to content Skip to sidebar Skip to footer

How Do I Make A Function Return Data That Was Set Within Function (child Snapshot) In Firebase

I want to return data to function that calls a function with firebase code, because of the asynchronous and nested structure of firebase queries it is not able to return values, I

Solution 1:

Data is loaded from the Firebase Database asynchronously. You cannot return a value now that hasn't been loaded yet. And until the async and await keywords are commonplace, you cannot make JavaScript wait for the async value.

The closest you can get today is to return a promise from get_val(). Then your calling code will be:

get_val().then(function(data) {
  console.log("...." + data);
});

To do this you'll have to implement get_val() as:

functionget_val() {
  var label = "10/2/2017";
  varName = localStorage.getItem("VName") || "delta";
  console.log("Name:::" + Name);
  var at_val;
  var dbref = firebase.database().ref("EmployeeDB/EInfo/").orderByChild("Name").equalTo(Name);
  return dbref.once("value").then(function(snapshot) {
    var promises = [];
    snapshot.forEach(function(childsnapshot) {
      var data = childsnapshot.val();
      varNameval = data.Name;
      Ikey = childsnapshot.key;
      var dxRef = firebase.database().ref("EmployeeDB/EApraise/" + Ikey).orderByChild("Dateval").equalTo(label);
      promises.push(
        dxRef.once("value").then(function(snapshot) {
          snapshot.forEach(function(childsnapshot) {
            var data = childsnapshot.val();
            at_val = data.Attitude;
          });
        }).then(function() {
          console.log("In then:" + at_val);
          return at_val;
        })
      );
    })
    returnPromise.all(promises);
  })
}

I made a few changes to get_val():

  • it uses the new 3.x versions of the Firebase SDK. The solution could also work with 2.x, I just didn't feel like setting up a jsbin for that.

  • it populates a list of promises, one for each of the EApraise records

  • it returns a promise that resolves when all the EApraise records are loaded.

  • it uses Firebase queries to find the correct record. This removes the need for checking the values in the then() callbacks. But more importantly it ensures that only the necessary data is downloaded.

To make that last point true, you need to add a few index definitions to the rules in your Firebase Database console:

{
  "rules": {
    "EmployeeDB": {
      "EInfo": {
          ".indexOn": "Name"
      }
      "EApraise": {
        "$eid": {
          ".indexOn": "Dateval"
        }
      }
    }
  }
}

Here a jsbin with the working code: http://jsbin.com/jawamilawo/edit?js,console

Post a Comment for "How Do I Make A Function Return Data That Was Set Within Function (child Snapshot) In Firebase"