【问题标题】:My async function is not waiting for a promise from Firebase我的异步函数没有等待 Firebase 的承诺
【发布时间】:2020-03-05 12:42:24
【问题描述】:

我目前正在学习异步的工作原理,同时使用 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。

我确定我在这里做了一些非常愚蠢的事情,但我暂时想不通,也没有其他人可以求助。

对不起,如果问题写得不好。第一次在这里发帖。欢迎任何反馈!

【问题讨论】:

  • 强烈建议在 TypeScript 中编写 async 代码(或任何与 Promise<T> 一起使用的代码),这有助于检测此类编码错误。 Angular 和 Firebase 都支持 TypeScript(在 Angular 中是必需的):firebase.google.com/docs/functions/typescript
  • 谢谢。我一定会的。这次是我为 CS 课程做的一个项目的扩展,所以我没有太多选择。

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


【解决方案1】:

您不应混合使用 awaitthens。然后你也不要忘记等待一个承诺(你永远不会等待/返回 .once 返回的承诺):

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

【讨论】:

  • 哇。这超级快。谢谢!我不完全理解为什么 async/then 不能很好地混合? await 是否不等待 'then()' 部分并在第一部分完成后立即执行?
  • 是的。但这正是你忘记的。你附上了一个then,但没有等待。如果您一直在等待,请不要忘记,阅读起来也容易得多
  • @JonasWilms 我花了 2 天时间解决了这个问题。非常感谢您的回答。
猜你喜欢
  • 2018-02-03
  • 1970-01-01
  • 2020-11-19
  • 2017-06-15
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-03-19
相关资源
最近更新 更多