如何返回firebase db';s快照';s值javascript

如何返回firebase db';s快照';s值javascript,javascript,firebase,function,firebase-realtime-database,Javascript,Firebase,Function,Firebase Realtime Database,我需要作为全球变量的快照。这是我的密码: dbRef.on('value', snap => { var data = snap.val(); }); console.log(data); 当我运行代码时,我得到一个错误(因为数据变量不是全局的)。如何使其成为全局变量?简单的方法是将数据的定义移动到回调之外,如下所示: var数据; 参考on(“值”,捕捉=>{ data=snap.val(); }); console.log(数据) 但您很快就会意识到这是行不通的——输出是未定义

我需要作为全球变量的快照。这是我的密码:

dbRef.on('value', snap => {
 var data = snap.val();
});

console.log(data);

当我运行代码时,我得到一个错误(因为数据变量不是全局的)。如何使其成为全局变量?

简单的方法是将
数据的定义移动到回调之外,如下所示:

var数据;
参考on(“值”,捕捉=>{
data=snap.val();
});
console.log(数据)
但您很快就会意识到这是行不通的——输出是未定义的。为什么?

Javascript是异步的,设置
数据
的回调在网络往返之后才被调用。同时,日志语句输出数据的当前值——未定义。如果您这样编写代码,这种行为会更清楚:

var data=“还没有数据”;
参考on(“值”,捕捉=>{
console.log(“明白了”);
data=snap.val();
});
功能报告(){
控制台日志(数据);
设置超时(报告,100);
}
报告();
这将输出如下内容(假设密钥的数据是来自数据库的
):

还没有数据
还没有数据
还没有数据
知道了
从数据库
从数据库
从数据库
所以,现在数据在一个全局变量中,这就是你问题的答案

诀窍是利用这一点,并能够判断数据何时可用。大多数情况下,您希望在回调本身中使用变量(在本例中,只需在回调内部移动
console.log
)——这是大多数函数所做的。当然,您选择的方法将取决于应用程序的性质

请记住,
回调将在每次更新密钥时调用(除非使用该方法)。因此,您的代码也需要处理这个问题。这是另一个原因,在回调本身中进行工作或者让外部代码能够处理数据中的更改更有意义