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 propMi 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.
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');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
Esto devuelve solo una matriz. ¿Tiene sentido usar await ? No, no devuelve una Promise
Pero si lo haces así:
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.