如何在 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 的工作原理,以便有效地使用它。
Doug Stevenson
2022-03-12
虽然道格的答案是更好的解决方案(因此我对此表示赞同),但我想指出为什么您当前的方法不起作用,这是因为您没有从顶级代码中返回任何内容。
因此,如果您不想使用
等待
,最接近当前代码工作的是:
800056527
,而更简单版本,删除额外的代码:
217708107
需要顶级
返回
,因为它允许嵌套的返回“ bubble up”然后回到调用
getowner
的代码。
Frank van Puffelen
2022-03-12