使用异步等待进行Firebase查询

时间:2018-09-20 09:48:26

标签: javascript firebase firebase-realtime-database async-await

目前,我正在执行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的其他代码)不在我的查询参考范围内。

1 个答案:

答案 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