Tengo dos problemas que no puedo resolver. Cuando llamo a GetParams primero para obtener los valores definidos usados de un archivo de texto, la línea de código después de que se llama primero, o se informa a la consola antes de recuperar los datos de la función. Cualquier dato recopilado en esa función es nulo y sin efecto. Claramente, a las variables se les asignan datos, pero después de que la llamada a la función desaparece.
let udGasPrice = 0; let udGasLimit = 0; let udSlippage = 0;Quiero obtener datos de un archivo de texto y asignarlos a variables que deben ser globales. puede ser asignado en una función pero usado fuera de ella. Entonces, arriba está lo que estaba haciendo para declararlos fuera de la función. porque si los declaro adentro, pierdo alcance. No parece correcto declarar con 0 y luego reasignar, pero ¿de qué otra manera puedo declararlos globalmente para que sean manipulados por otra función?
a continuación, se llama al código para que la función haga el trabajo
GetParams(); console.log('udGasPrice = " + udGasPrice );El código después de GetParams informa 0 pero dentro de la función los valores son correctos
Los datos se leen y asignan claramente dentro de la función. No es bonito ni inteligente, pero funciona.
function GetParams() { const fs = require('fs') fs.readFile('./Config.txt', 'utf8' , (err, data) => { if (err) { console.error(err) return; } // read file contents into variable to be manipulated var fcnts = data; let icnt = 0; for (var x = 0; x < fcnts.length; x++) { var c = fcnts.charAt(x); //find the comma if (c == ',') { // found the comma, count it so we know where we are. icnt++; if (icnt == 1 ) { // the first param udGasPrice = fcnts.slice(0, x); console.log(`udGasPrice = ` + udGasPrice); } else if (icnt == 2 ) { // second param udGaslimit = fcnts.slice(udGasPrice.length+1, x); console.log(`udGaslimit = ` + udGaslimit); } else { udSlippage = fcnts.slice(udGaslimit.length + udGasPrice.length +2, x); console.log(`udSlippage = ` + udSlippage ); } } } }) }Como dije, sé que el algoritmo es deficiente, pero funciona (soy muy novato), pero ¿por qué las variables no retienen el valor y por qué el código después de GetParams() se ejecuta primero? Gracias por tu tiempo.
El código se ejecuta antes de que finalice el método GetParams, porque lo que hace es un trabajo asíncrono. Puede verlo mediante el uso de una función de devolución de llamada cuando se lee el archivo.
Como práctica recomendada, debe proporcionar una devolución de llamada a GetParams y llamarlo con los resultados del archivo o usar un enfoque más moderno mediante la adopción de promesas y (opcionalmente) la sintaxis async/await.
fs.readFile lee de forma asincrónica todo el contenido de un archivo. Por lo tanto, su console.log('udGasPrice = " + udGasPrice ); no esperará la función GetParams .
Las posibles soluciones son:
Usar devolución de llamada o promesa
let udGasPrice = 0; let udGasLimit = 0; let udSlippage = 0; GetParams(() => { console.log("udGasPrice = " + udGasPrice); }); function GetParams(callback) { const fs = require('fs') fs.readFile('./Config.txt', 'utf8', (err, data) => { if (err) { console.error(err) return; } // read file contents into variable to be manipulated var fcnts = data; let icnt = 0; for (var x = 0; x < fcnts.length; x++) { var c = fcnts.charAt(x); //find the comma if (c == ',') { // found the comma, count it so we know where we are. icnt++; if (icnt == 1) { // the first param udGasPrice = fcnts.slice(0, x); console.log(`udGasPrice = ` + udGasPrice); } else if (icnt == 2) { // second param udGaslimit = fcnts.slice(udGasPrice.length + 1, x); console.log(`udGaslimit = ` + udGaslimit); } else { udSlippage = fcnts.slice(udGaslimit.length + udGasPrice.length + 2, x); console.log(`udSlippage = ` + udSlippage); } } } callback() }) }fs.readFileSync (ruta [, opciones]) : realiza la misma operación sincronizada; aún necesita editar su código en consecuencia
Además, es recomendable que no edite variables globales en la función y devuelva variables actualizadas desde la función.