Sin embargo, tengo una matriz, uno de los objetos secundarios necesita obtener datos de otra ubicación en mi base de datos de Firebase para mostrarlos en la matriz. Esto requiere una Promesa.
¿Cómo muestro los datos de la Promesa en la matriz?
getListofReferrers() { // // // Getting list of referrers from Firebase. this.eventData.getReferrersList().on('value', snapshot => { let rawList98 = []; snapshot.forEach(snap => { // Bringing the information over into a local array to show on the page. rawList98.unshift({ id: snap.key, text: this.eventData.getOtherNameExternal(snap.val().userid).then( (v)=> {return v}), userid: snap.val().userid, username: snap.val().username, email: snap.val().useremail, referralPoints: this.eventData.numberWithCommas(this.eventData.getOtherProfileProperty(snap.val().userid, "referralPoints") || 0), }); }) // Taking the information into a "this." variable this.referralList = rawList98; console.log(this.referralList); }); }Sigo recibiendo: [promesa de objeto] cuando muestro el valor de "nombre de usuario".
En consola.log(rawList98); sin embargo, obtengo lo siguiente:
email: "pjoc@pjaguar.com" id: "referrer9OxMTyUDfiXrLp9O65XW0hUbHgH2" referralPoints: "0" username: t __zone_symbol__state: true __zone_symbol__value: "John Doe" [[Prototype]]: Object userid: "9OxMTyUDfiXrLp9O65XW0hUbHgH2"¿Cómo es que muestra el valor recibido de la Promesa pero no puedo capturar eso en .then() para asignarlo correctamente al "nombre de usuario" secundario? Tendré que llamar a esta promesa para obtener el nombre de usuario de cada nodo en la base de datos de Firebase.
Dado que debe esperar a que el nombre de usuario esté disponible antes de poder construir el objeto, debe colocar el código dentro de .then :
this.eventData.getUserName(snap.val().userid).then(v => { rawList98.unshift({ id: snap.key, username: v, userid: snap.val().userid, email: snap.val().useremail }); })O, usando async/await:
async function someFunction () { const v = await this.eventData.getUserName(snap.val().userid); rawList98.unshift({ id: snap.key, username: v, userid: snap.val().userid, email: snap.val().useremail }); }La propiedad de nombre de username que está insertando en la matriz es una promesa. Entonces, para obtener el valor real allí, debe usar then o await :
const user = rawList98.shift(); const username = await user.username; console.log(username);Gracias a Frank van Puffelen. Aquí estaba la solución a mi problema: tuve que poner unshift() en una variable para obtener el índice y usarlo para asignar el nombre de username secundario después. Yo uso rawList98.length-user ya que la función unshift está agregando datos en la parte inferior, no en la parte superior.
getListofReferrers() { // Getting list of referrers from Firebase. this.eventData.getReferrersList().on('value', snapshot => { let rawList98 = []; snapshot.forEach(snap => { var user user = rawList98.unshift({ id: snap.key, username: null, userid: snap.val().userid, email: snap.val().useremail, referralPoints: this.eventData.numberWithCommas(this.eventData.getOtherProfileProperty(snap.val().userid, "referralPoints") || 0), }); this.eventData.getOtherNameExternal(snap.val().userid).then( (v)=> { rawList98[rawList98.length-user].username = v}) }) // Taking the information into a "this." variable this.referralList = rawList98; console.log(this.referralList); }); }