• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

208
Views
Cómo recorrer una matriz de documentos de Firebase Firestore e insertar valores en la matriz

Estoy escribiendo una función de nube de Firebase en node.JS que lee datos de usuario de Firebase Firestore. No puedo insertar los valores de los tokens en la matriz de tokens y devolver todos los tokens al final de la función. Mi código es el siguiente:

 function getTokens(subscribers) { return new Promise(async function (resolve, reject) { const tokenArray = []; subscribers.forEach(async (subscriber) => { await firestore .collection('users') .doc(subscriber) .get() .then((user) => { console.log("Getting user data for user: ", user); const tokens = user.data().tokens; if (tokens) { tokens.forEach((token) => { console.log("Adding token to token array"); // data is available here but does not push into tokenArray tokenArray.push(token); }); } }).catch((error) => { console.error(error); reject(error); }); }); console.log("Token Array -- Final: ", tokenArray); resolve(tokenArray); }); };

almost 3 years ago · Juan Pablo Isaza
2 answers
Answer question

0

El código OP se puede corregir y hacer más conciso de la siguiente manera:

 async function getTokens(subscribers) { const getUser = subscriber => firestore.collection('users').doc(subscriber).get(); const promises = subscribers.map(getUser); const users = await Promise.all(promises); return users.map(user => user.data().tokens).flat() }

Algunas notas:

  • decora la función como async , ya que incluye una espera
  • no cree ninguna promesa adicional con Promise.new() , get() () de Firestore devuelve una promesa
  • recopile get promesas en una matriz con map y ejecútelas con Promise.all()
  • mapear los tokens de datos de los usuarios data.tokens produce una matriz de matrices. Aplanarlo y listo.
  • una catch que solo tira, es como no tener atrapada
almost 3 years ago · Juan Pablo Isaza Report

0

No puede usar async-await await en un bucle forEach . Intente mapear una matriz de promesas y luego use Promise.all() como se muestra a continuación:

 function getTokens(subscribers) { return new Promise(async function (resolve, reject) { const subscribersDocs = await Promise.all( subscribers.map((subscriber) => { return firestore.collection("users").doc(subscriber).get(); }) ); const tokenArray = subscribersDocs.reduce((acc, curr) => { const tokens = curr.data().tokens; if (tokens) { acc = acc.concat(tokens); } return acc; }, []); console.log("Token Array -- Final: ", tokenArray); resolve(tokenArray); }); }

También consulte: Uso de async/await con un bucle forEach

almost 3 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error