开发者问题收集

如何在 Firebase 获取请求中等待承诺

2022-03-12
263

我尝试获取所有者变量,由于该函数通常将其返回为未定义,因此我决定使用 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
        })
    }
2个回答

如果您使用 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)
}

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

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

https://javascript.info/async-await

Doug Stevenson
2022-03-12

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

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

800056527

,而更简单版本,删除额外的代码:

217708107

需要顶级 返回 ,因为它允许嵌套的返回“ bubble up”然后回到调用 getowner 的代码。

Frank van Puffelen
2022-03-12