Javascript 如何等待Firebase检索值,然后才退出该函数?

Javascript 如何等待Firebase检索值,然后才退出该函数?,javascript,firebase,firebase-realtime-database,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/"+nex

我有一个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
}

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


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

试试这个:

 function CheckBuyingCondition(prefix){

    var Res= "";

        var Current_Price_Open_ref = firebase.database().ref("dailyT/Current_Price_Open/"+nextDayTrading).orderByChild("Prefix").equalTo(prefix)
           return 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;

                }); 

                 return res;
            }else{ 
                res = "NA";
            }
            });
}

Firebase查询是承诺,因此您可以使用它,因为您可以从承诺返回结果,并使用另一个承诺获取结果。

尝试以下操作:

 function CheckBuyingCondition(prefix){

    var Res= "";

        var Current_Price_Open_ref = firebase.database().ref("dailyT/Current_Price_Open/"+nextDayTrading).orderByChild("Prefix").equalTo(prefix)
           return 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;

                }); 

                 return res;
            }else{ 
                res = "NA";
            }
            });
}

Firebase查询是承诺,因此您可以使用它,因为您可以从承诺返回结果,并使用另一个承诺获取结果。

使用
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
关键字;它只是让你的函数看起来像一个

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


更多阅读:

使用
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
关键字;它只是让你的函数看起来像一个

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


更多阅读:

Firebase查询是promisesFirebase查询是promisesThank,我如何以良好的方式获取函数返回的值?因为现在我得到了[object Promise]Use。然后(result){your code}result变量是您返回的res的值再次感谢,我这样做了,但现在它使返回的函数是异步的。CheckBuyingCondition(前缀).then(函数(res){console.log(“res:+res);});log(“它在承诺返回之前运行此注释”);在控制台日志中res的输出是什么?现在res的输出是正确的值!但是“res”之后的下一个代码并行运行,我需要的是下一个代码将首先等待“res”结果。谢谢,我如何以一种好的方式获取函数返回的值?因为现在我得到了[object Promise]Use。然后(result){your code}result变量是您返回的res的值再次感谢,我这样做了,但现在它使返回的函数是异步的。CheckBuyingCondition(前缀).then(函数(res){console.log(“res:+res);});log(“它在承诺返回之前运行此注释”);在控制台日志中res的输出是什么?现在res的输出是正确的值!但是“res”之后的下一个代码并行运行,我需要的是下一个代码将首先等待“res”结果。