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

384
Vistas
Lectura de archivos asíncrona, no se puede hacer que la función finalice antes de regresar

Estoy tratando de leer todos los archivos en la carpeta, verifique si se ha featured: true accesorio, aumente el contador si lo hace y luego arroje un error si hay más de 1 archivo de este tipo. Pero por alguna razón, mi código no espera y simplemente salta a la última sección, esta es la salida

 this should be last Inside item, looking for featured prop Inside item, looking for featured prop

Mi código:

 const fs = require('fs'); const findInDir = require('./utils/findInDir'); (async () => { const dir = './public/page-data/blog'; const fileRegex = /.*/; const allFiles = findInDir(dir, fileRegex); let result = 0; await allFiles.map(file => { fs.readFile(file, 'utf8', (err, data) => { const obj = JSON.parse(data); if (obj.result.pageContext.featured === true) { console.log('Inside item, looking for featured prop'); result += 1; } }); }); console.log('this should be last'); if (result > 1) { throw new Error('There are multiple featured blog posts, please fix.'); } })();

Necesito ayuda para entender qué estoy haciendo mal.

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Debe usar la versión sin devolución de llamada de fs.readFile para await a leer el archivo. Además, usar .map no tiene mucho sentido ya que en realidad no estás mapeando algo, así que simplemente usa un bucle for .. of :

 for (const file of allFiles){ try { const data = await fs.promises.readFile(file); // ... } catch(err) { // handle error } } console.log('this should be last');
about 4 years ago · Juan Pablo Isaza Denunciar

0

Solución rápida:

 (async () => { const dir = "./public/page-data/blog"; const fileRegex = /.*/; const allFiles = findInDir(dir, fileRegex); try { await Promise.all( allFiles.map((file) => { return new Promise((resolve, reject) => { fs.readFile(file, "utf8", (err, data) => { const obj = JSON.parse(data); if (obj.result.pageContext.featured === true) { reject("Inside item, looking for featured prop"); } else { resolve(); } }); }); }) ); } catch (err) { throw new Error("There are multiple featured blog posts, please fix."); } })();

En lugar de verificar cada elemento uno por uno como en un bucle, lo hago así. Comprueba "paralelo" si alguno de ellos se ha featured como verdadero. Por lo tanto, es más rápido que un bucle.

Si es true , lo rechazo y Promise.all() se detiene. El try / catch de Promise.all() el rechazo


Debe comprender solo 1 cosa para saber cuándo usar await y cuándo no.

Solo tiene sentido usar await en las promesas.

¿Cómo saber si es una promesa? Solo console.log . Regístrelo

¿La consola registra Promise ? Usar await

¿NO consola log Promise ? No tiene sentido usar await

ingrese la descripción de la imagen aquí

Esto devuelve solo una matriz. ¿Tiene sentido usar await ? No, no devuelve una Promise

Pero si lo haces así:

ingrese la descripción de la imagen aquí

Tienes una serie de promesas. Aquí es un poco diferente. Tienes una matriz PERO los elementos dentro son una promesa. Puede usar Promise.all() básicamente espera por cada elemento en la matriz hasta que esté listo.

about 4 years ago · Juan Pablo Isaza 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