es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo hacer una variable visible fuera de la función de devolución de llamada fs.readFile.

Tengo una tarea en mi archivo gulpfile.js:

function compileHandlebars() {
    options = {
        batch: ['./src/views/modules/*.hbs']
    }
let data;

fs.readFile('./data.json', 'utf-8', (error, content) => {
    if(error) throw error;
    data = content;
    console.log(data) // --> muestra el contenido real
});

console.log(data); // --> muestra undefined

return gulp.src('./src/views/layouts/index.hbs')
    .pipe(handlebars(data)) // <-- recibe 'undefined' como argumento
    .pipe(rename('index.html'))
    .pipe(gulp.dest('dist'));
};

Se supone que debe cargar el contenido de data.json y asignarlo a una variable llamada ‘data’, para que pueda ser utilizado en la función handlebars () en el pipeline para formar HTML a partir de la plantilla. El problema es que console.log () muestra ‘undefined’ tan pronto como lo saque del ámbito de devolución de llamada fs.readFile (). ¿Cómo puedo hacer que la variable ‘data’ mantenga el valor que establecí en la función de devolución de llamada?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para que la variable ‘data’ mantenga el valor que se establece en la función de devolución de llamada, es necesario mover la canalización que utiliza la variable ‘data’ adentro de la función de devolución de llamada fs.readFile (). Esto se debe a que la función fs.readFile () es asíncrona, lo que significa que no esperará a que se lea el archivo antes de pasar a la siguiente línea de código. Al mover la canalización dentro de la función de devolución de llamada, se asegura de que se ejecute solo una vez que se haya leído el archivo y se haya asignado un valor a la variable ‘data’.

    Aquí hay una versión actualizada del código con la canalización movida dentro de la función de devolución de llamada:

    function compileHandlebars() {
        options = {
            batch: ['./src/views/modules/*.hbs']
        }
    
        let data;
    
        fs.readFile('./data.json', 'utf-8', (error, content) => {
            if (error) throw error;
            data = content;
            console.log(data) // --> outputs actual content
    
            gulp.src('./src/views/layouts/index.hbs')
                .pipe(handlebars(data)) // <-- receives 'data' as an argument
                .pipe(rename('index.html'))
                .pipe(gulp.dest('dist'));
        });
    
        // console.log(data); // --> outputs undefined - this line is no longer needed
    
    };
    

    Con esta modificación, la canalización se ejecutará solo una vez que la variable ‘data’ haya sido asignada con un valor del archivo leído, y esto asegura que la variable ‘data’ mantenga el valor asignado en la función de devolución de llamada.

Comments are closed.