如何返回Firebase数据库的快照值? -javascript

时间:2020-07-31 14:00:20

标签: javascript firebase function firebase-realtime-database

我需要将快照作为全局变量。这是我的代码:

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

console.log(data);

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

1 个答案:

答案 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方法)。因此,您的代码也将需要处理。这是另一个原因,在回调本身中完成工作,或者让您的外部代码能够处理数据中的更改,是更有意义的。