Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我的异步函数没有等待Firebase的承诺_Javascript_Firebase Realtime Database_Async Await - Fatal编程技术网

Javascript 我的异步函数没有等待Firebase的承诺

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

我目前正在学习异步如何工作,同时正在使用Firebase数据库进行一个小项目。 据我所知,wait应该暂停函数,直到承诺得到解决,但在我的情况下,它不是在等待

我缩短了两个用于尝试和测试此功能的函数:

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;
}