为何currentUserName()函数返回ZoneAwarePromise而非用户名?
解决
currentUserName()返回ZoneAwarePromise而非用户名的问题 我懂你现在的困扰——调用currentUserName()时本来想拿到用户名,结果得到的却是ZoneAwarePromise。这本质是异步操作的特性导致的:你的函数里包含Firebase数据库的异步查询,这类操作本身就会返回Promise,而你直接把这个Promise(或者基于它的链式调用结果)返回了,自然拿不到同步的用户名值。
先说说原代码的两个问题:
- 返回的是Promise而非最终值:你最后返回的
Promise.all(promises).then(...)本身就是一个Promise,它只会在未来某个时刻解析出用户名,而不是直接返回用户名。 - 查询效率低:用
orderByKey().once('value')后遍历所有用户节点找对应ID,完全没必要——Firebase支持直接通过节点路径定位,不用遍历。
优化后的解决方案
我给你两种写法,选你习惯的就行:
写法1:用async/await让代码更简洁直观
async currentUserName() { // 获取users节点引用 const firebaseData = firebase.database().ref('users'); // 当前用户ID const userid = this.afAuth.auth.currentUser.uid; // 直接通过userID定位到对应用户节点,等待查询完成 const userSnapshot = await firebaseData.child(userid).once('value'); // 返回用户名,用可选链避免用户节点不存在时的报错 return userSnapshot.val()?.displayName; }
写法2:保持.then链式调用风格
currentUserName() { const firebaseData = firebase.database().ref('users'); const userid = this.afAuth.auth.currentUser.uid; // 直接返回查询Promise,在then中返回用户名 return firebaseData.child(userid).once('value').then(userSnapshot => { return userSnapshot.val()?.displayName; }); }
正确调用方式
不管用哪种写法,currentUserName()都会返回一个Promise,你需要通过以下方式获取实际的用户名:
- 在
async函数中用await:
async getUserNameAndUse() { const userName = await currentUserName(); console.log('当前用户名:', userName); // 这里可以直接使用userName做后续操作 }
- 用
.then链式处理:
currentUserName().then(userName => { console.log('当前用户名:', userName); // 处理用户名逻辑 });
核心总结
异步操作(比如Firebase数据库查询)不可能同步返回结果,你的函数必然会返回Promise。你要做的不是“让函数直接返回用户名”,而是通过await或.then来等待Promise解析,拿到最终的用户名值。
内容的提问来源于stack exchange,提问作者Иван Сидоров
相关产品推荐
相关产品推荐

