Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

234
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!