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