我需要将快照作为全局变量。这是我的代码:
dbRef.on('value', snap => {
var data = snap.val();
});
console.log(data);
当我运行代码时,出现错误(因为数据变量不是全局变量)。如何使其成为全局变量?
答案 0 :(得分:0)
最简单的方法就是将data
的定义移到回调之外,就像这样:
var data;
ref.on("value", snap => {
data = snap.val();
});
console.log(data)
但是您很快就会意识到这不起作用-输出为undefined
。为什么?
JavaScript是异步的,设置data
的回调直到网络往返后才被调用。同时,日志记录语句输出数据的当前值-未定义。如果您编写如下代码,则这种行为会更清楚:
var data = "no data yet";
ref.on("value", snap => {
console.log("got it");
data = snap.val();
});
function report() {
console.log(data);
setTimeout(report, 100);
}
report();
这将输出如下内容(假设密钥的数据为from the database
):
no data yet
no data yet
no data yet
got it
from the database
from the database
from the database
因此,现在数据位于全局变量中,这是您问题的答案。
诀窍是利用此信息并能够判断何时有数据可用。大多数时候,您想使用回调本身中的变量来工作(在这种情况下,只需将console.log
移到回调内部),这就是大多数examples in the documentation所要做的。当然,您选择的方法将取决于应用程序的性质。
请记住,每次对键进行更新时,都会调用value
回调(除非您使用once方法)。因此,您的代码也将需要处理。这是另一个原因,在回调本身中完成工作,或者让您的外部代码能够处理数据中的更改,是更有意义的。