【问题标题】:How to return the firebase db's snapshoot's value? - javascript如何返回 Firebase 数据库快照值? - javascript
【发布时间】:2020-07-31 23:28:17
【问题描述】:

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

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

console.log(data);

当我运行代码时出现错误(因为数据变量不是全局变量)。我怎样才能使它成为全局变量?

【问题讨论】:

    标签: javascript firebase function firebase-realtime-database


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-25
      • 2020-08-05
      • 1970-01-01
      相关资源
      最近更新 更多