Javascript 如何等待Firebase检索值,然后才退出该函数?
我有一个Firebase查询 由于Firebase是异步工作的,因此函数将继续运行,而无需等待Firebase检索值 是否有方法等待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
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”结果。