Javascript 对firebase查询使用异步等待
目前,我正在执行firebase查询并记录值,但是我希望在函数之外操作我的值,这很棘手,因为firebase查询是异步的。 我想这样做,因为随着代码变得越来越复杂,将所有代码嵌套在这个查询中会变得非常混乱 目前: 我的数据库如下所示:Javascript 对firebase查询使用异步等待,javascript,firebase,firebase-realtime-database,async-await,Javascript,Firebase,Firebase Realtime Database,Async Await,目前,我正在执行firebase查询并记录值,但是我希望在函数之外操作我的值,这很棘手,因为firebase查询是异步的。 我想这样做,因为随着代码变得越来越复杂,将所有代码嵌套在这个查询中会变得非常混乱 目前: 我的数据库如下所示: { "test" : "Hello from my database!" } 我的代码: var config = { apiKey: "", authDomain: "", databaseURL: "", projectI
{
"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(或我选择用来操作FireBaseMG的其他代码)不在我的ref.on查询范围内。如果您想通过
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);
});
请注意,如果您只需要从数据库读取一次(而不是持续地侦听),则可以使用
one()
方法,该方法返回一个承诺,在这种情况下,您可以使用async/wait。参见文档。异步调用ref.on
中的回调。。。仅仅因为你在里面等待,它就不会运行synchronously@JaromandaX你知道如何使ref.on同步运行吗?不,异步不能同步-异步回调的要点是你不知道何时调用回调,因为它依赖于一些外部“事件”-使代码同步,你必须等待那个“事件”或者知道它什么时候会发生。。。javascript不能以这种方式工作,因为on()
启动了一个连续侦听器,它不会返回承诺,因此不能与async
/wait
一起使用。看见