Hoy estaba tratando de construir un generador simple que pudiera recorrer un directorio de archivos de registro e iterar a través de cada archivo. ¿Debería ser una tarea relativamente sencilla? Me encontré con un problema con el uso de generadores, donde el uso de uno normal no funcionó, pero async sí lo hizo en un código totalmente síncrono.
¿Me estoy perdiendo algo obvio, o es esto un error?
Aquí está el código síncrono.
// Assumes that the files and events within files are properly ordered function* streamFromCache(dataDir, files) { Logger.info('Streaming file from cache'); const files = fs.readdirSync(dataDir).sort(); for(const file of files) { const logLines = JSON.parse(fs.readFileSync(`${dataDir}/${file}`)); for(const logLine of logLines) { yield logLine; } } const consumer = () => { ... console.log('before'); for(const log of streamFromCache(dataDir, files) { console.log('test'); } console.log('after') }la salida es justo antes, después, sin registros intermedios
Sin embargo, funciona cuando lo cambio a esto:
// Assumes that the files and events within files are properly ordered async function* streamFromCache(dataDir, files) { Logger.info('Streaming file from cache'); const files = fs.readdirSync(dataDir).sort(); for(const file of files) { const logLines = JSON.parse(fs.readFileSync(`${dataDir}/${file}`))['result']; for(const logLine of logLines) { yield logLine; } } const consumer = async () => { ... console.log('before'); for await (const log of streamFromCache(dataDir, files) { console.log('test'); } console.log('after') }Obtengo antes, prueba, después como se esperaba.
Estoy usando ts-node 10.4.0 y mecanografiado 4.5.4.