繁体   English   中英

如何在 firebase get 请求中等待 promise

[英]How to await a promise inside a firebase get request

我正在尝试获取所有者变量,并且由于 function 通常将其返回为未定义,我决定使用 async/await 但我不能在另一个 function 中使用 await 并且我可以访问它之外的变量。 有没有简单的解决方案,或者我是否必须返工 function?

 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()返回的 promise:

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

您可能还应该编写代码来检查快照中是否有任何数据,并决定如果没有找到该文档(如文档中所示),该怎么做。

您可能想回顾一下 async/await 的工作原理,以便有效地使用它。

https://javascript.info/async-await

虽然 Doug 的回答是更好的解决方案(因此我对此表示赞成),但我想指出为什么您当前的方法不起作用,这是因为您没有从顶级代码返回任何内容。

所以如果你不想使用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)
    })
}

需要顶层return ,因为它允许嵌套返回“冒泡”并返回到调用getOwner的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM