Sanya Shaikh
Sanya Shaikh

Reputation: 31

running functions synchronously in firebase

I am trying to call a function to get a value from a 'subproduct' table and insert it in to another table. However the value which I am returning is not fetching the latest value from table and it is getting returned even before the snapshot part of the function is getting executed. I want it to run synchronously. Is there a better way in which it can be written.

function getGSTvalues(para1) {
  var gstVar = 1;
  var gstVarPromise = SubProductRef.once("value").then(function(snapshot) {
    snapshot.forEach(function(child) {
      if (para1 == child.val().subproductName) {
        gstvar = child.val().gst;
        console.log("InsidePromise" + gstVar);
      }
    });
    console.log("outside fun : " + gstVar);
  });
  console.log("outside fun1 : " + gstVar);
  return gstVar;
};

This is where I am calling the above function:

var gstans = getGSTvalues($('#edit_ProductSubType').val());

Any help would be appreciated

Upvotes: 1

Views: 135

Answers (1)

Rory McCrossan
Rory McCrossan

Reputation: 337560

Using synchronous logic would be a big step backwards. The best solution here would be to use the asynchronous pattern correctly and provide a callback function to getGSTvalues() which is executed after the async operation completes and receives the result as an argument. Try this:

function getGSTvalues(para1, cb) {
  var gstVar = 1;
  var gstVarPromise = SubProductRef.once("value").then(function(snapshot) {
    snapshot.forEach(function(child) {
      if (para1 == child.val().subproductName) {
        gstVar = child.val().gst;
      }
    });

    cb && cb(gstVar);
  });
};

getGSTvalues($('#edit_ProductSubType').val(), function(gst) {
  console.log(gst);
  // work with the value here...
});

Another alternative would be to return the promise from SubProductRef from getGSTvalues() and apply then() on that in the calling scope, although this would render the function largely redundant.

Also note that JS is case sensitive so gstVar is not the same as gstvar. I corrected this above.

Upvotes: 1

Related Questions