Javascript 我的异步函数没有等待Firebase的承诺
我目前正在学习异步如何工作,同时正在使用Firebase数据库进行一个小项目。 据我所知,wait应该暂停函数,直到承诺得到解决,但在我的情况下,它不是在等待 我缩短了两个用于尝试和测试此功能的函数:Javascript 我的异步函数没有等待Firebase的承诺,javascript,firebase-realtime-database,async-await,Javascript,Firebase Realtime Database,Async Await,我目前正在学习异步如何工作,同时正在使用Firebase数据库进行一个小项目。 据我所知,wait应该暂停函数,直到承诺得到解决,但在我的情况下,它不是在等待 我缩短了两个用于尝试和测试此功能的函数: async findUser(id) { await this.firebase.findUserData(id).then( value => { console.log('finduser stopped waiti
async findUser(id) {
await this.firebase.findUserData(id).then(
value => {
console.log('finduser stopped waiting');
return value;
}
)
}
控制台输出如下所示:
它首先运行findUser,然后是Firebase调用,但在返回值之前不会等待承诺完成。找到上次打印的用户id
我肯定我在这里做了一些非常愚蠢的事情,但我一时想不出来,没有其他人可以求助
如果问题写得不好,很抱歉。第一次在这里发帖。欢迎任何反馈 你不应该把等待和然后混在一起。那么你也别忘了等待承诺(你从不等待/回报.once返回的承诺):
我强烈建议在TypeScript中编写
async
代码(或任何与Promise
一起工作的代码),这有助于检测类似的编码错误。Angular和Firebase都支持TypeScript(在Angular中是必需的):谢谢。我一定会尽我所能。这次是我为CS课程做的一个项目的延伸,所以我没有太多选择。哇。这真是太快了。非常感谢。我不太明白为什么async/then不能很好地混合?是否等待而不是等待“then()”部分并在第一部分完成后立即执行?是的。但那正是你忘记的。你当时附上了一封信,但没有等待。如果你一直在等待,你不会忘记这一点,也会更容易做到read@JonasWilms解决这个问题花了我两天时间。非常感谢你的回答。
async findUserData(userId){
console.log('firebase started looking for user');
firebase.database().ref('/users/' + userId).once('value').then(function(snapshot){
let user = (snapshot.val());
console.log('found: ' + user);
return user;
});
}
async findUserData(userId){
console.log('firebase started looking for user');
const snapshot = await firebase.database().ref('/users/' + userId).once('value');
let user = (snapshot.val());
console.log('found: ' + user);
return user;
}
async findUser(id) {
const value = await this.firebase.findUserData(id);
console.log('finduser stopped waiting');
return value;
}