Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

233
Vistas
No se pueden entender las funciones asíncronas en NodeJS

Ya he pasado 6 horas tratando de descubrir cómo hacer esto en NodeJS.

Estoy usando NodeJS con Express y MongoDB.

Tengo una base de datos que tiene dos colecciones a saber. Listados y Categorías. Cada lista tiene una "categoría", que es una identificación que se asigna a una categoría dentro de la colección Categorías.

Lo que quiero hacer es buscar todos los listados, luego recorrerlos todos y obtener el título de la categoría de la colección Categorías usando la identificación de la categoría.

Esto es lo que tenía para obtener todos los listados:

 const listings_raw = [];

await db.collection("listings").find().forEach(listing => listings_raw.push(listing));

El código anterior funciona bien. El problema que estoy teniendo es con esto:

 const listings = [];

listings_raw.forEach(async listing => {
 const category_id = listing.category;

 const category_title = await db.collection('categories').findOne({_id: objectId(category_id)});

 listing.category_title = category_title;

 listings.push(listing);
});

response.send(listings);

La response.send(listings); se ejecuta antes de que se complete listings_raw.forEach .

Quiero enviar los datos solo después de que todos los listados se hayan completado con los títulos de las categorías.

¡Después de pasar 6 horas, se me ocurrió el siguiente truco que estoy seguro es desagradable!

 const listings_raw = [];

const em = new events.EventEmitter();

await db.collection("listings").find().forEach(listing => listings_raw.push(listing));

const listings = [];

let counter = 0;

listings_raw.forEach(async (listing) => {
 const category_id = listing.category;

 const category = await db.collection('categories').findOne({_id: objectId(category_id)});

 listing.category_title = category.title;

 listings.push(listing);

 if (counter === listings_raw.length - 1) {
 em.emit('listings:processing:done');
 }

 counter++;
});

em.on('listings:processing:done', () => {
 response.send(listings);
});

Por favor, ¿alguien puede explicarme o guiarme sobre cómo se debe hacer esto en JavaScript?

Básicamente, no puedo averiguar cómo saber si todas las promesas se han resuelto o no.

¡Gracias!

almost 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

La función listings_raw.forEach se ejecuta de forma síncrona en la matriz, aunque luego esté realizando una operación asíncrona dentro de ella.

Promise.all le permitirá await el resultado de una serie de promesas. Por lo tanto, puede .map los listados a una serie de promesas que devuelven el listado actualizado.

 const listings = await Promise.all(listings_raw.map(async listing => {
 const category_id = listing.category;

 const category_title = await db.collection('categories').findOne({_id: dependencies.objectId(category_id)});

 listing.category_title = category_title;

 return listing;
});

response.send(listings);
almost 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda