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.

En Node.js, ¿cómo puedo implementar una devolución de llamada dentro de una función recursiva?

Estoy intentando hacer un programa que lea todos los archivos en tu computadora y coloque sus rutas dentro de un array. Sin embargo, la función es recursiva y no sé cómo registrar los resultados una vez que la función termine.

Obviamente, necesito algún tipo de callback, pero he intentado varios enfoques diferentes y la función de callback termina ejecutándose antes de que el resultado esté completo. Además, quiero que la función de callback se ejecute solo una vez (cuando la función recursiva haya terminado).

Este es mi código actual, ¿cómo puedo insertar una función de callback en la función “readAllFolders”?

const testFolder = "C:/";
const fs = require('fs');

function readAllFolders(path){
    var returnArr = [];
    fs.promises.readdir(path, (err, files) => {
        if(err){
            return;
        }

        files.forEach(file => {
            try{
                var filePath = path + file;
                if(fs.existsSync(filePath) && fs.lstatSync(filePath).isDirectory()){
                     readAllFolders(filePath + '/');
                }else{
                    returnArr.push(filePath);
                }
            }catch(e){

            }
        });

    });

    return returnArr;
}

var arr = readAllFolders(testFolder);
console.log(arr);
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para insertar una función de devolución de llamada en la función readAllFolders, puedes modificar la función para aceptar una función de devolución de llamada como parámetro. Luego puedes llamar a la función de devolución de llamada con los resultados una vez que la función recursiva haya terminado. Aquí tienes una versión actualizada del código:

    const testFolder = "C:/"; 
    const fs = require('fs');
    
    function readAllFolders(path, callback){
        var returnArr = [];
        fs.readdir(path, (err, files) => {
            if(err){
                callback([]);
                return;
            }
    
            var count = files.length;
            if(count == 0){
                callback(returnArr);
                return;
            }
    
            files.forEach(file => {
                var filePath = path + file;
                fs.stat(filePath, (err, stats) => {
                    if(stats.isDirectory()){
                        readAllFolders(filePath + '/', (res) => {
                            count--;
                            returnArr = returnArr.concat(res);
                            if(count <= 0){
                                callback(returnArr);
                            }
                        });
                    }else{
                        count--;
                        returnArr.push(filePath);
                        if(count <= 0){
                            callback(returnArr);
                        }
                    }
                });
            });
      });
    }
    
    readAllFolders(testFolder, (arr) => {
        console.log(arr);
    });
    

    En esta versión actualizada, la función readAllFolders ahora acepta una función de devolución de llamada como segundo argumento. La función ahora cuenta el número de archivos en el directorio y se llama recursivamente en cualquier directorio que encuentre. Una vez que se han registrado todos los archivos y directorios, llama a la función de devolución de llamada con el resultado.

    La instrucción console.log se mueve fuera de la llamada a la función y ahora está envuelta dentro de la función de devolución de llamada. Esto asegura que la instrucción console.log se ejecute únicamente una vez que la función recursiva esté completa.

Comments are closed.