从firebase实时数据库的读取功能中传递出价值

时间:2018-04-11 05:57:48

标签: javascript firebase firebase-realtime-database

我试图传递位于firebase的读取函数中的值,该值是forEach循环。但我无法弄清楚为什么它不适用于以下代码。

var object = {};
  var objectKey = objectKey ? objectKey : firebase.database().ref().child('test').push().key;
  object[objectKey] = {a:"1", b:"2", c:"3"};
  firebase.database().ref('test').update(object);

  var objRef = firebase.database().ref('test');
  var displayObj;
  var total = 0;
  objRef.on('value', function(snapshot) {
    snapshot.forEach(function(childSnapshot){
      displayObj = childSnapshot.val();
      var a = displayObj.a;
      var b = displayObj.b;
      var c = displayObj.c;
      total = a + b + c;
      console.log(total);       //expected result: 123
      return total;
    });
  });
  console.log(total);           //I wish to set total = 123 but instead 
                                //it return the original value, 0

为了您的信息,我通过firebase控制台测试了写入功能和阅读功能。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

objRef.on是异步的,这意味着它在结果可用于回调函数之前立即返回。稍后将使用您要求的数据快照执行回调函数。

最重要的是,来自return total的返回值是从回调函数返回的,这是没有意义的。它与回调后的日志行的值无关。

更进一步,当objRef所指向的位置的数据发生变化时,将传递给on()的回调被重复调用。这可能不是你想要的。如果您想在某个位置创建单个快照,请使用once()而不是on()。

底线是:实时数据库回调是异步的,因此如果要使用来自实时数据库的快照中的值,请在调用回调后仅处理。请阅读此博客以了解有关why Firebase APIs are asynchronous的更多信息。