Esta es posiblemente una pregunta duplicada, pero parece que no puedo resolverlo.
Esencialmente, estoy creando un código que se ejecuta en un ciclo while donde luego necesito leer un archivo dentro de ese ciclo while, y parece que fileRead en el código simplemente evita que el ciclo while llegue al final. Todavía soy bastante novato en javascript, por lo que probablemente sea una solución fácil.
Lo que he intentado hasta ahora es cambiar mi función jsonReader para sincronizar (readFileSync) y eso simplemente detuvo el código antes de que casi no hiciera nada. (así es como es el código actual) También intenté crear una segunda función para leer específicamente los archivos que necesito de forma sincronizada y tampoco pareció funcionar. Ni siquiera estoy seguro de si esto tiene que ver con el sincronismo.
Mi código:
module.exports = { name: 'xprun', description: "runs the xp handler", execute(message) { const name = message.author.username; const server = message.guild.id; const fs = require('fs'); function jsonReader(filePath, cb) { fs.readFileSync(filePath, 'utf-8', (err, fileData) => { if (err) { return cb && cb(err); } try { const object = JSON.parse(fileData); return cb && cb(null, object); } catch (err) { return cb && cb(err); } }); } console.log('Starting the loop...'); // var run = true; var i = 0; while (run == true) { i++ console.log('Running the loop...'); // Loop stops and re-runs here // read #1 jsonReader(`./userData/rank/${server}_server/1.json`, (err, data) => { if (err) { console.log(err); } else { console.log(data.id); // } // read #2 jsonReader(`./userData/xp/${server}_server/${name}_xp.json`, (err, data) => { if (err) { console.log(err); } else { console.log(data.rank); // } console.log('The loop was completed'); // if (i >= 5) { run = false; } }); // end read #1 }); // end read #2 } // end while console.log('The loop was ended'); // } // end execute } // endComo @CherryDT mencionó en los comentarios, readFileSync no acepta una devolución de llamada. Debido a que readFileSync es síncrono, no necesita una devolución de llamada; readFile acepta una devolución de llamada solo porque es asíncrona, porque necesita esperar hasta que haya leído el archivo antes de llamar al código en la devolución de llamada. El método sincrónico no necesita esperar de esta manera, por lo que puede mover el código de devolución de llamada fuera de la devolución de llamada de la siguiente manera:
function jsonReader(filePath, cb) { try { const fileData = fs.readFileSync(filePath, 'utf-8'); const object = JSON.parse(fileData); return cb && cb(null, object); } catch (err) { return cb && cb(err); } } La razón por la que su ciclo se estaba ejecutando infinitamente fue porque configuró run en false solo dentro de su método cb de devolución de llamada, pero debido a que readFileSync no acepta una devolución de llamada, su devolución de llamada nunca se ejecutó. Con el código anterior, su devolución de llamada ahora debería estar ejecutándose, y el ciclo ya no debería ejecutarse infinitamente (a menos que haya otros problemas dentro de sus devoluciones de llamada).