【问题标题】:Using async await for firebase query [duplicate]使用异步等待进行firebase查询[重复]
【发布时间】:2018-09-20 22:03:51
【问题描述】:

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

【问题讨论】:

  • ref.on 中的回调被异步调用...只是因为您在其中等待不会使其同步运行
  • @JaromandaX 你知道我怎样才能让 ref.on 同步运行吗?
  • 不,异步不能同步——异步回调的关键在于你不知道回调何时会被调用,因为它依赖于一些外部“事件”——使代码同步,你必须等待那个“事件”或者知道它什么时候会发生......javascript不能那样工作
  • 由于on()启动了一个连续监听器,它不会返回一个promise,因此它不能和async/await一起使用。见stackoverflow.com/questions/50495594/…

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


【解决方案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() 方法,该方法返回一个承诺,在这种情况下您可以使用异步/等待。请参阅文档here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2019-07-29
    • 2021-07-15
    相关资源
    最近更新 更多