Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 对firebase查询使用异步等待_Javascript_Firebase_Firebase Realtime Database_Async Await - Fatal编程技术网

Javascript 对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

目前,我正在执行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(或我选择用来操作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
一起使用。看见