如何等待Firebase检索值,然后才退出该功能?

时间:2018-02-22 18:00:55

标签: javascript firebase firebase-realtime-database

我有一个Firebase查询。

由于Firebase异步工作,因此该功能可以继续运行,而无需等待Firebase检索值。

有没有办法等待Firebase查询的结果,然后再从函数返回?

  function CheckBuyingCondition(prefix){

        var Res= "";

            var Current_Price_Open_ref = firebase.database().ref("dailyT/Current_Price_Open/"+nextDayTrading).orderByChild("Prefix").equalTo(prefix)
                Current_Price_Open_ref.once("value").then(function(snapshot) {
                    if(snapshot.exists()){
                        snapshot.forEach(function(childSnapshot) {  
              var val = childSnapshot.val();

                        res =""+ val.Current_Price_Open;
                    }); 
                }else{ 
                    res = "NA";
                }
            });

            return res; //(Here i got res = "" instead of the correct value from Firebase query
}

3 个答案:

答案 0 :(得分:0)

您提议的是将Firebase SDK异步调用转换为同步调用。这不是一个好主意,说实话,在JavaScript中甚至都不可能。如果您需要创建一个处理Firebase API的辅助函数,那么该函数应该接受在工作完成时调用的回调函数,或者返回一个promise以便函数的调用者可以决定下一步该做什么。

Read here to learn more about why Firebase APIs are asynchronous.

答案 1 :(得分:0)

试试这个:

.as-console-wrapper { max-height: 100% !important; top: 0; }

Firebase查询是承诺,因此您可以从承诺中返回结果并使用其他承诺获取结果。

答案 2 :(得分:0)

使用async/await

async function CheckBuyingCondition(prefix) {
  var res = '';

  var Current_Price_Open_ref = firebase.database()
    .ref(`dailyT/Current_Price_Open/${nextDayTrading}`)
    .orderByChild('Prefix')
    .equalTo(prefix);

  var snapshot = await Current_Price_Open_ref.once('value');

  if(snapshot.exists()) {
    snapshot.forEach(function(childSnapshot) {  
      var val = childSnapshot.val();
      res = `${val.Current_Price_Open}`;
    });
  } else { 
    res = 'NA';
  }

  return res;
}

请注意,这并不会使您的函数同步,因此函数声明开头的async关键字;它只是使你的功能看起来像一个。

在功能内的第3行,您会注意到await关键字。这等待您的承诺解决,然后返回结果,在您的情况下,结果是来自Firebase的快照。您只能在await个函数中使用async

更多阅读:Javascript Async/Await