ref.child("path").on("value", snapshot => {
var z = Object.keys(snapshot.val())[2];
y = snapshot.val()[z];
//Call the friggin thing
exportData(y);
function exportData(y) {
exporting(y);
}
});
function exporting(y) {
var x = y;
//console.log(y);
return x;
}
我想将x存储在全局变量中。
我不能在下面做代码,因为不会传递'y'。 “ y”是局部变量。
var answer = exporting();
answer();
答案 0 :(得分:2)
将值存储在全局变量中不是问题,这是何时使您烦恼。
从Firebase异步加载数据。这意味着代码不会按照您期望的顺序运行。您可以通过在其中添加一些日志来最轻松地看到这一点:
lista = []
for item in a:
print item
>>> [[1, 2, 3, 4, 5, 6, 7, 8, 9], [0.4, 3]]
>>> [[1, 2, 3, 4, 5, 6, 7, 8, 9], [1.8, 1]]
if item[:1] == item2[:1]:
if item[9][1] <= item2[9][1]:
lista.append(item)
if item[9][1] > item2[9][1]:
lista.append(item2)
print lista
>>> [[1, 2, 3, 4, 5, 6, 7, 8, 9, [1.8, 1]]
运行此代码时,它会打印:
开始加载值之前
开始加载值后
加载值
这可能不是您期望的顺序。但这很好地解释了为什么在访问全局变量时未设置全局变量:该值尚未从数据库返回。
这就是为什么要在回调函数内部内部移动需要数据库数据的代码的原因。或者,您可以使用console.log("Before starting to load value");
ref.child("path").on("value", snapshot => {
console.log("Loaded value");
});
console.log("After starting to load value");
返回承诺的事实,这样可以更轻松地处理结果:
once()
请注意,对于新手来说,异步加载是令人难以置信的常见混乱来源。我强烈建议您查看有关该主题的其他一些问题:
答案 1 :(得分:0)
我想出了使用jQuery的解决方案
ref.child("path").on("value", snapshot => {
var y = Object.keys(snapshot.val())[2];
z = snapshot.val()[y];
$("#id").attr("data-stored", z);
updateVal();
});
var x;
function updateVal() {
x = parseFloat($("#id").attr("data-stored"));
}
console.log("It Works! " + x);