Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

116
Vistas
Lógica asíncrona/espera en Javascript

Tengo un código que me ayuda a cambiar el nombre de varios archivos con datos. En los datos (rarityList) hay un nombre y un valor para cada archivo que tengo. Por el bien de la publicación, acabo de reemplazar los valores con un dummy, pero puedes imaginar que hay 500 de ellos.

Funciona y hace el trabajo pero de una manera que no pretendía. En la terminal, primero imprime 0 (total), luego copia todos los archivos y luego le cambia el nombre. Pero esperaba ver algo como ¡La copia está lista! y el cambio de nombre está hecho! y finalmente número total al final de la terminal. ¿Podría explicarme lo que me estoy perdiendo aquí?

 const fs = require("fs"); const path = "C:\\Users\\shepard\\Desktop\\Head"; const newPath = "C:\\Users\\shepard\\Desktop\\NewHead"; let files = fs.readdirSync(path); const rarityList = [{name: "a", value: 3},{name: "b", value: 2}]; let total = 0; const copy = async (_e) => { fs.copyFile(path + "\\" + _e, newPath + "\\" + _e, err => {if (err) {console.log(err)}}); }; const rename = async (_e, _index) => { let t = _e.replace(".png", "#" + rarityList[_index].value + ".png") fs.rename(newPath + "\\" + _e, newPath + "\\" + t, err => {if (err) {console.log(err)}}); }; files.forEach(async (e) => { await copy(e); console.log("Copying is done!"); rarityList.forEach(async (element, index) => { if (element.name == e.slice(0,-4)) { await rename(e,index); console.log("Renaming is done! for " + e + " with the rarity weight of " + rarityList[index].value); total += rarityList[index].value; }; }); }); console.log(total);

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Posiblemente no sea la mejor respuesta, sino una solución:

 const fs = require("fs"); const path = "C:\\Users\\shepard\\Desktop\\Head"; const newPath = "C:\\Users\\shepard\\Desktop\\NewHead"; let files = fs.readdirSync(path); const rarityList = [ { name: "a", value: 3 }, { name: "b", value: 2 }, ]; let total = 0; const copy = async (_e) => { fs.copyFile(path + "\\" + _e, newPath + "\\" + _e, (err) => { if (err) { console.log(err); } }); }; const rename = async (_e, _index) => { let t = _e.replace(".png", "#" + rarityList[_index].value + ".png"); fs.rename(newPath + "\\" + _e, newPath + "\\" + t, (err) => { if (err) { console.log(err); } }); }; const renameFiles = async () => { for (let e of files) { await copy(e); let index = 0; for (let element of rarityList) { if (element.name == e.slice(0, -4)) { await rename(e, index); console.log( "Renaming is done! for " + e + " with the rarity weight of " + rarityList[index].value ); total += rarityList[index].value; } index += 1; } } console.log('in async func', total); }; renameFiles(); console.log('out of async function', total);

El truco es que no se espera la función asíncrona, por lo que el total no se actualiza en el "nivel superior". Puedes hacer una espera de "nivel superior" así:

 const fs = require("fs"); const path = "C:\\Users\\shepard\\Desktop\\Head"; const newPath = "C:\\Users\\shepard\\Desktop\\NewHead"; let files = fs.readdirSync(path); const rarityList = [ { name: "a", value: 3 }, { name: "b", value: 2 }, ]; let total = 0; const copy = async (_e) => { fs.copyFile(path + "\\" + _e, newPath + "\\" + _e, (err) => { if (err) { console.log(err); } }); }; const rename = async (_e, _index) => { let t = _e.replace(".png", "#" + rarityList[_index].value + ".png"); fs.rename(newPath + "\\" + _e, newPath + "\\" + t, (err) => { if (err) { console.log(err); } }); }; const renameFiles = async () => { for (let e of files) { await copy(e); let index = 0; for (let element of rarityList) { if (element.name == e.slice(0, -4)) { await rename(e, index); console.log( "Renaming is done! for " + e + " with the rarity weight of " + rarityList[index].value ); total += rarityList[index].value; } index += 1; } } console.log("in function", total); }; (async function() { await renameFiles() console.log(total) }());
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda