Estoy tratando de obtener la variable del propietario y, dado que la función generalmente la devuelve como indefinida, decidí usar async/await pero no puedo usar await dentro de otra función y puedo acceder a la variable fuera de ella. ¿Hay una solución fácil o tengo que volver a trabajar en la función?
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 }) }Si usa async/await, casi nunca es necesario usar then() o new Promise() . Puede escribir simplemente esto, esperando la promesa devuelta por 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) }Probablemente también debería escribir código para comprobar si había datos en la instantánea y decidir qué hacer si el documento no se encuentra como se ve en la documentación .
Es posible que desee revisar cómo funciona async/await para usarlo de manera efectiva.
Si bien la respuesta de Doug es la mejor solución (de ahí mi voto a favor), quería señalar por qué su enfoque actual no funciona, que es porque no está devolviendo nada del código de nivel superior.
Entonces, si no desea usar await , lo más cercano para que su código actual funcione sería:
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 }) }Y la versión más sencilla, eliminando el código extra:
function getOwner() { return database.collection("users").doc(this.owner).get().then(doc => { return new User(doc.data().username, "", doc.data().email, [], doc.data().info) }) } Se necesita el return de nivel superior, porque permite que el retorno anidado se "burbujee" y regrese al código que llama a getOwner .