如何在 firebase get 请求中等待承诺

How to await a promise inside a firebase get request

我正在尝试获取所有者变量,并且由于该函数通常 returns 它未定义,所以我决定使用 async/await 但我不能在另一个函数中使用 await 并且我可以访问它之外的变量。有没有简单的解决方案,还是我必须重新编写函数?

async getOwner() {
        database.collection("users").doc(this.owner).get().then(data => {
            var owner = new Promise(function (resolve, reject) {
                resolve(new User(data.data().username, "", data.data().email, [], data.data().info))
            })
            let result = await owner
            return result
        })
    }

如果您使用 async/await,则几乎不需要使用 then()new Promise()。您可以简单地这样写,等待 get():

返回的承诺
async function getOwner() {
    const snapshot = await database.collection("users").doc(this.owner).get()
    const data = snapshot.data()
    return new User(data.username, data.email, [], data.info)
}

您可能还应该编写代码来检查快照中是否有任何数据,并决定如果在 documentation.

中找不到文档时要做什么

您可能需要查看 async/await 的工作原理,以便有效地使用它。

https://javascript.info/async-await

虽然 Doug 的回答是更好的解决方案(因此我投赞成票),但我想指出为什么您当前的方法不起作用,这是因为您没有 return top-level代码。

因此,如果您不想使用 await,最接近当前代码工作的方法是:

function getOwner() {
    //  Add return here
    return database.collection("users").doc(this.owner).get().then(data => {
        var owner = new Promise(function (resolve, reject) {
            resolve(new User(data.data().username, "", data.data().email, [], data.data().info))
        })
        let result = await owner
        return result
    })
}

更简单的版本,去掉了额外的代码:

function getOwner() {
    return database.collection("users").doc(this.owner).get().then(doc => {
        return new User(doc.data().username, "", doc.data().email, [], doc.data().info)
    })
}

top-level return 是必需的,因为它允许嵌套的 return “冒泡”并返回到调用 getOwner.[=15 的代码=]