我试图调用一个函数来从“子产品”表中获取一个值并将其插入到另一个表中。但是,我返回的值不是从表中获取最新值,即使在执行函数的快照部分之前,也要返回该值。我希望它同步运行。有没有更好的书写方式。
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());
任何帮助将不胜感激
答案 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区分大小写,因此gstVar
与gstvar
不同。我在上面纠正了这个问题。