目前,我正在执行Firebase查询并记录该值,但是我想在函数之外操作我的值,这很棘手,因为Firebase查询是异步的。 我想这样做是因为随着代码变得越来越复杂,将我所有的代码嵌套在此查询中会变得非常混乱。
目前: 我的数据库如下:
{
"test" : "Hello from my database!"
}
我的代码:
var config = {
apiKey: "",
authDomain: "",
databaseURL: "",
projectId: "",
storageBucket: "",
messagingSenderId: ""
};
firebase.initializeApp(config);
database=firebase.database();
var ref = database.ref('test');
var firebaseMsg ='';
ref.on('value',function(snap){
firebaseMsg=snap.val();
console.log(firebaseMsg);
});
但是,我希望能够执行以下操作:
var firebaseMsg ='';
//attempting async/await
ref.on('value',async function(snap){
firebaseMsg= await snap.val();
});
//outside of the ref.on query
console.log(firebaseMsg);
因此console.log(或我选择操纵firebaseMsg的其他代码)不在我的查询参考范围内。
答案 0 :(得分:1)
如果您想通过on()
侦听器在应用程序UI中反映数据库中的更改,则必须在回调函数中进行。
如果您的问题是编写一些“干净的”代码(即避免“将我的所有代码嵌套在此查询中”),则可以很好地使用以下函数:
function sayHello(msg) {
console.log(msg);
//Update your UI as you wish with the value of msg
}
ref.on('value',function(snap) {
firebaseMsg = snap.val();
console.log(firebaseMsg);
sayHello(firebaseMsg);
});
请注意,如果您只需要一次读取数据库(而不是连续收听),则可以使用once()
方法,该方法返回一个promise,在这种情况下您可以使用异步/等待。参见文档here。