我的异步功能不等待Firebase的承诺

时间:2019-11-08 21:35:59

标签: javascript firebase-realtime-database async-await

当使用Firebase数据库进行小型项目时,我目前正在学习异步的工作方式。 据我了解,await应该暂停该功能,直到解决承诺为止,但就我而言,它不是在等待。

我已经缩短了用于尝试测试的2个功能:

async findUser(id) {
        await this.firebase.findUserData(id).then(
            value => {
                console.log('finduser stopped waiting');
                return value;
            }
        )
    }
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;
        });
    }

控制台输出如下所示: (not allowed to embed images yet)

它先运行findUser,然后运行Firebase调用,但在返回值之前不等待该承诺完成。找到的用户ID最后打印。

我确定我在这里做的事情确实很愚蠢,但是我暂时无法弄清楚了,没有其他人可以求助了。

很抱歉,如果问题写得不好。第一次在这里发布。欢迎任何反馈!

1 个答案:

答案 0 :(得分:3)

请勿混用awaitthen。然后,您也不会忘记等待一个承诺(您永远​​不会等待/返回.once返回的Promise):

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