Estoy tratando de leer un archivo csv, obtener datos para cada registro en csv, hacer algunas operaciones y al final (después de que se completen todas las operaciones asíncronas) escribir un nuevo archivo csv aquí está el código:
async function readInputCsv() { results = []; fs.createReadStream('./example_short.csv') .pipe(csv()) .on('data', async function(data){ console.log("trying for name: ", data.username); let edu = await getLastEducation(data.username); results.push({ name: data.username, level: edu }) console.log(data.username,": ", edu) }).on("end", () => { console.log("end ! "); writeCsv(results); }); }Lo que pasa es "¡fin!" se imprime antes de que la función getLastEducation devuelva las respuestas
fs.createReadStream().on() no acepta Promises como segundo argumento.
on(event: string, listener: (...args: any[]) => void): this;
En primer lugar, los results en este caso son una variable global. Le sugiero que use la palabra clave let para declararla dentro del alcance de la función.
Lo que sucede en este caso es que el tiempo que tarda getLastEducation() en la operación asíncrona es mayor que el tiempo requerido para el archivo example_short.csv .
Para evitar esto, agregue la palabra clave await antes fs.createReadStream() y mueva la función writeCsv() (supongo que está usando csv-writer dentro de esta función) después de la operación de lectura completa. La palabra clave await lo hará esperar hasta que finalice la operación de obtención asíncrona.
async function readInputCsv() { let results = []; await fs .createReadStream('./example_short.csv') .pipe(csv()) .on('data', async function (data) { console.log('trying for name: ', data.username); let edu = await getLastEducation(data.username); results.push({ name: data.username, level: edu, }); console.log(data.username, ': ', edu); }) .on('end', () => { console.log('end ! '); }); writeCsv(results); }