[英]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 的工作原理,以便有效地使用它。
虽然 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.