在Firebase中同步运行功能

时间:2019-03-21 09:48:45

标签: javascript firebase firebase-realtime-database

我试图调用一个函数来从“子产品”表中获取一个值并将其插入到另一个表中。但是,我返回的值不是从表中获取最新值,即使在执行函数的快照部分之前,也要返回该值。我希望它同步运行。有没有更好的书写方式。

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

这是我调用上述函数的地方:

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

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

使用同步逻辑将倒退一大步。最好的解决方案是正确使用异步模式,并为getGSTvalues()提供一个回调函数,该函数在异步操作完成并将结果作为参数接收后执行。试试这个:

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

另一种选择是从SubProductRef返回getGSTvalues()的promise,并将then()应用于调用范围内的承诺,尽管这将使该函数在很大程度上变得多余。

还要注意,JS区分大小写,因此gstVargstvar不同。我在上面纠正了这个问题。