hola, ¿cómo puedo salir del bucle for? Quiero poder salir de él en la devolución de llamada en la declaración if
Quiero que este programa cree una carpeta en el directorio dado y cada vez que arroje un error quiero que cambie el nombre de la carpeta y le agregue un número para que cuando diga que la carpeta ya existe, cree una carpeta única name hasta que no arroje un error.
Verificaré el código de error más tarde, ayúdame a resolver esto primero.
const path = require('path'); function folder(folderName) { for (let i = 1; i <= 10; i++) { let pathNumber = i; let fullPath = folderName + pathNumber; fs.mkdir(path.join("D:", fullPath), (err) => { if (!err) { return; // I want to break out of the loop here } }) } } folder("folder");Mucho más simple sin esperar
const numFolders = 10, folders = Array.from(Array(numFolders), (_,i) => `folder${i+1}`), len = folder.length; let cnt = 0; const makeFolder = () => { if (cnt >= len) return; // stop because done fs.mkdir(path.join("D:", fullPath), (err) => { if (err) { makeFolder(); // only call again if error } cnt++ } makeFolder()No puede escribir el código de esa manera porque el ciclo for ya se realizará antes de que se llame a cualquiera de las devoluciones de llamada fs.mkdir() . Son asincrónicos y suceden MÁS TARDE.
Si desea ejecutar una iteración del ciclo, incluida fs.mkdir() antes de pasar a cualquier otra, puede usar async/await await con fs.promises.mkdir() .
Así es como podría verse una solución con fs.promises.mkdir() . También agregué el manejo de errores para el caso en que ya existen los 10 nombres de subdirección que está intentando.
async function folder(folderName) { let lastError; for (let pathNumber = 1; pathNumber <= 10; pathNumber++) { let fullPath = path.join("D:", folderName + pathNumber); try { await fs.promises.mkdir(fullPath); return fullPath; } catch(e) { lastError = e; // ignore error so we keep trying other numbers } } throw lastError; } folder("folder").then(fullPath => { console.log(`dir created: ${fullPath}`); }).catch(err => { console.log(err); });