JavaScript - Firebase 值转换为全局变量


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();

将值存储在全局变量中不是问题,而是什么时候把你搞砸了。

数据以异步方式从 Firebase 加载。这意味着代码不会按您可能预期的顺序运行。您可以通过在其中放置一些日志记录来最容易地看到这一点:

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()返回一个 promise 的事实,这使得它更容易处理:

function loadData() {
return ref.child("path").once("value");
});
loadData().then((snapshot) => {
... use the data from snapshot
});

请注意,异步加载对于不熟悉它的开发人员来说是一个非常常见的混淆来源。我强烈建议您查看有关该主题的其他一些问题:

  • 如何从异步回调函数返回值?
  • 如何从异步调用返回响应?
  • 如何通过回调函数获取返回值
  • 将一个值从 Firebase JS 回调方法 (DAL( 返回到另一个函数(控制器(
  • 函数的火基返回输出

我想出了一个使用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);

最新更新