Tengo una función debajo donde el propósito es analizar múltiples archivos csv locales. Para cada archivo csv analizado, tomo de 1 a 5 elementos aleatorios. Dado que el analizador CSV genera los datos en una estructura de matriz anidada ( [['a'], ['b'], ['c']] ), proceso más los datos y extraigo los elementos de la matriz individuales para insertarlos en el final formación.
Mi objetivo final es actualizar los valores en el mapa de types pasando las matrices respectivas para cada una de sus claves
let health = createHealthData(); console.log(health, 'final output') function createHealthData() { let types = new Map(); types.set('allergies', ''); types.set('medications', '') let start = 1; let limit = 5; for (let key of types.keys()) { let randNum = Math.floor(Math.random() * (limit - start + 1) + start); // Generates random numbers between start and limit let file = fs.createReadStream(path.resolve(__dirname, `${key}.csv`)) Papa.parse(file, { header: false, complete: (results) => { let first = [] let data = results.data; let final = []; for (let i = 1; i <= randNum; i++) { first.push(data[Math.floor(Math.random() * data.length)]) } first.forEach((x) => { x.forEach((y) => { final.push(y) }) }) types.set(key, final); console.log(types); } }) } return types; } Mi función analiza y procesa bien los archivos csv, pero se niega a actualizar las claves existentes en el mapa una vez que devuelvo el mapa de types
Por ejemplo, mi salida en console.log(types) me da:
Map(2) { allergies => ['Banana Allergy'], medications => ['Opana ER', 'Atrovent HFA'] }que es lo que pretendo pasar de la función.
Sin embargo, al ver la variable de health después de que la función termine de ejecutarse, el resultado es:
Map(2) {'allergies' => '', 'medications' => ''} final output como si la línea types.set(key,final) nunca se ejecutara al final de la función. Estoy luchando por encontrar cuál es la fuente de este error y, según el alcance de la variable de types en la función, no veo dónde podría sobrescribirse.
Según entiendo, la función regresa sin esperar la devolución de llamada de Papa.parse, así que pruebe las soluciones de ¿Cómo usar Promises con PapaParse? para esperar a que finalice la devolución de llamada completa y luego devolver los tipos
Parece que Papa.parse es asíncrono: https://www.papaparse.com/docs
"No devuelve nada. Los resultados se proporcionan de forma asincrónica a una función de devolución de llamada".
Dado que return types al final, aún no obtendrá los valores adecuados debido a la naturaleza asíncrona de la ejecución (es decir, los tipos de retorno ocurren primero, seguidos por la devolución de llamada completa de análisis).
Hay una pregunta similar que describe diferentes formas de manejar Papa.parse: ¿Cómo usar Promises con PapaParse?