我试图传递位于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控制台测试了写入功能和阅读功能。
提前谢谢。
答案 0 :(得分:0)
objRef.on
是异步的,这意味着它在结果可用于回调函数之前立即返回。稍后将使用您要求的数据快照执行回调函数。
最重要的是,来自return total
的返回值是从回调函数返回的,这是没有意义的。它与回调后的日志行的值无关。
更进一步,当objRef
所指向的位置的数据发生变化时,将传递给on()的回调被重复调用。这可能不是你想要的。如果您想在某个位置创建单个快照,请使用once()而不是on()。
底线是:实时数据库回调是异步的,因此如果要使用来自实时数据库的快照中的值,请在调用回调后仅处理。请阅读此博客以了解有关why Firebase APIs are asynchronous的更多信息。