使用return返回Firebase快照值时出现undefined问题求助
问题根源
你给GetElements加了async,调用时也用了await,但Firebase的once用的是回调模式——函数会直接跳过异步操作先执行return Holder,这时候回调还没触发,Holder根本没被赋值,自然返回undefined。另外Holder没声明成局部变量,会变成全局变量,属于不良编码习惯。
修正后的代码
async function GetElements(element, place) { try { // 去掉回调,直接await once返回的Promise,等待异步操作完成 const snapshot = await firebase.database().ref().child(place).orderByChild("uid").equalTo(element).once('value'); let Holder; snapshot.forEach(childSnapshot => { Holder = childSnapshot.val(); }); return Holder; } catch (errorObject) { // 用try/catch捕获异步错误,替代原来的错误回调 console.log("User does not exist"); document.cookie = "uid=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT"; window.location.replace("login.html"); throw errorObject; // 抛出错误让调用方感知,也可以返回null } } async function Test() { var bob = await GetElements("POkHi19eyZTfdeYECVpZByeVv2R2", "users/"); console.log(bob); } Test();
关键修改点
- 把Firebase的回调式调用改成
Promise+await模式:once不传递回调时会返回Promise,await会让函数暂停,直到快照数据获取完成再继续执行。 - 用
try/catch处理异步错误,替代原来的错误回调函数。 - 将
Holder声明为局部变量,避免全局变量污染。
内容的提问来源于stack exchange,提问作者Ben Unwin
相关产品推荐
相关产品推荐

