我的Async函数未等待Firebase返回的Promise,求技术解决方法
问题分析与修复方案
嘿,我一眼就发现问题所在啦!你的代码里有两个关键的小疏漏,导致await完全没起到“暂停等待Promise解析”的作用,咱们一步步来修正:
1. findUserData函数没有返回异步操作的Promise
你在findUserData里发起了Firebase的查询firebase.database().ref(...).once('value'),这本身是一个Promise,但你只在它的.then()回调里return了用户数据,却没有把整个Promise链返回出去。
加上async关键字的函数如果没有主动返回Promise,会默认返回一个已经resolve的空Promise,所以await this.firebase.findUserData(id)根本不会等待Firebase的异步查询完成,直接就继续往下执行了。
2. findUser函数没有传递最终结果
就算修复了findUserData,你的findUser里的await后面跟着的.then()虽然return了value,但整个findUser函数没有把这个值return出去,调用findUser的地方也拿不到最终的用户数据。
修正后的代码
先修复findUserData(两种写法任选其一)
写法一:用async/await简化(更推荐)
async findUserData(userId){ console.log('firebase started looking for user'); // 直接await Firebase的Promise,拿到快照后解析数据 const snapshot = await firebase.database().ref('/users/' + userId).once('value'); const user = snapshot.val(); console.log('found: ' + user); return user; }
写法二:直接返回Promise链(不用async关键字也可以)
findUserData(userId){ console.log('firebase started looking for user'); // 关键:return整个Promise链,让调用者能await它 return firebase.database().ref('/users/' + userId).once('value').then(function(snapshot){ const user = snapshot.val(); console.log('found: ' + user); return user; }); }
再修复findUser
async findUser(id) { // 直接await拿到findUserData的结果,不用嵌套.then,代码更清晰 const user = await this.firebase.findUserData(id); console.log('finduser stopped waiting'); return user; }
修正后的控制台输出顺序
现在执行代码,控制台会按预期的顺序打印:
firebase started looking for userfound: 用户IDfinduser stopped waiting
这样await就真正起到了暂停函数执行、等待异步操作完成的作用啦!
内容的提问来源于stack exchange,提问作者Pokora
相关产品推荐
相关产品推荐

