He estado empezando a jugar con Node.js recientemente y he encontrado una situación en la que necesito una pequeña guía sobre la forma prescriptiva de node.js de llevar a cabo una tarea. En este caso particular, necesito crear un grupo de directorios y, cuando se hayan creado todos los directorios, necesito realizar alguna operación final. El orden en que se crean los directorios no importa, solo necesito realizar una operación final después de la última.Node.js prescriptivo
La manera más fácil de lograr esto sería recurrir a los viejos hábitos sincrónicos. Es decir, simplemente llame al fs.mkdirSync
para cada uno de los directorios y realice la operación al final. Por ejemplo:
fs.mkdirSync('a', 0755);
fs.mkdirSync('a/b', 0755);
fs.mkdirSync('a/b/c', 0755);
performFinalOperation();
Si bien esto funcionaría, no parece que sea la forma de node.js de hacerlo. Obviamente, el programa se bloquearía mientras espera que el sistema operativo cree el directorio y lo devuelva. En un sistema muy cargado con un sistema de archivos montado de forma remota, cada una de las llamadas mkdirSync
podría llevar mucho tiempo. Entonces, claramente, este no es el mejor enfoque.
Uno de los principales puntos de venta de Node.js es el hecho de que es asincrónico. Por lo que las llamadas a fs.mkdir
podrían encadenarse a través de las devoluciones de llamada:
fs.mkdir('a', 0755, function(e) {
if (!e) {
fs.mkdir('a/b', 0755, function(e) {
if (!e) {
fs.mkdir('a/b/c', 0755, function(e) {
if (!e) {
performFinalOperation();
}
});
}
});
}
});
Una vez más, este enfoque Estoy seguro que funciona, pero conduce a la anidación muy profunda y la duplicación de código. Tiene el beneficio de no bloquear mientras se crean los directorios, pero ¿a qué costo?
Otro enfoque sería la de obtener realmente de lujo en un esfuerzo por evitar la duplicación de código y de anidación:
(function (directories) {
if (directories.length === 0) {
performFinalOperation();
} else {
var tail = arguments.callee;
fs.mkdir(directories.shift(), 0755, function(e) {
tail(directories);
});
}
})(['a', 'a/b', 'a/b/c']);
Este enfoque hace uso de todo tipo de cosas locas: las funciones de llamada auto anónima y los argumentos mágicos. Llamado Pero lo peor de todo es que no es obvio lo que el código está haciendo a primera vista.
Por lo tanto, si bien la pregunta concreta es sobre la creación de directorios, estoy más interesado en el enfoque que un experimentado veterano node.js tomaría cuando surja este tipo de situación. Estoy específicamente no interesado en qué bibliotecas hay para facilitar esto.
Usaría Deferreds o crearía una función de ayuda que se llama a sí misma de forma recursiva siempre que haya carpetas restantes para crear. – Tower
Oye, si estuvieras buscando una utilidad que lo haga por ti, usarías 'async'. Se necesita el dolor de lidiar con el modelo asincrónico. Es mejor separar las tareas y no reinventar la rueda. IMHO :) –