You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 18:55:27