Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

210
Visualizações
Leyendo el archivo solo después de que la función haya terminado

Tengo una función doSmth que crea un archivo "data.json" al final. (el archivo SE crea al final de la ejecución del script). Sin embargo, cuando intento fs.readFileSync usando await y luego, dice

 Error: ENOENT: no such file or directory, open 'data.json'

aquí está mi código

 const doSmth = async() => { await zip.forEach(async(relativePath: any, file: any) => { const fs = require("fs"); let fileExists = fs.existsSync('data.json'); if (fileExists) { fs.readFileSync('data.json') console.log("file already exists") fs.writeFileSync("data.json", JSON.stringify("")) } else { console.log("file didnt exist") fs.writeFileSync("data.json", JSON.stringify("")) } }) } await doSmth().then(async () => { const fs = require("fs"); console.log("reached") fs.readFileSync("data.json") })

¿Cómo espero a que se cree el archivo data.json antes de leerlo?

Editar: de los comentarios cambié mi código a esto y funciona

 const doSmth = async() => { await Promise.all(zip.forEach(async(relativePath: any, file: any) => { return new Promise(resolve => { const fs = require("fs"); let fileExists = fs.existsSync('data.json'); if (fileExists) { fs.readFileSync('data.json') console.log("file already exists") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } else { console.log("file didnt exist") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } }) })) }

pero ahora tengo una espera dentro y causa el mismo error de archivo de datos no encontrado

 const doSmth = async() => { await Promise.all(zip.forEach(async(relativePath: any, file: any) => { return new Promise(async resolve => { const eachFile = await zip.file(file.name).async("string") const jsonObject = JSON.parse(eachFile) const fs = require("fs"); let fileExists = fs.existsSync('data.json'); if (fileExists) { fs.readFileSync('data.json') console.log("file already exists") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } else { console.log("file didnt exist") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } }) })) }
about 4 years ago · Juan Pablo Isaza
3 Respostas
Responde à pergunta

0

el problema es que no está escribiendo el archivo de forma sincrónica en su bloque catch

 const doSmth = async() => { await zip.forEach(async(relativePath: any, file: any) => { const fs = require("fs"); try { fs.readFileSync('data.json') console.log("file already exists") fs.writeFileSync("data.json", JSON.stringify("")) } catch (error) { console.log("file didnt exist") fs.writeFileSync('data.json', JSON.stringify("")); // Yes, writeFileSync does create a new file when the file is not exists // So even this catch is redundant, use fs.existsSync if you really need to know the file exists or not } }) }

o es posible que desee hacer una primisificación adecuada para cada cosa

about 4 years ago · Juan Pablo Isaza Relatório

0

Está utilizando await, pero no está devolviendo promesas.

Usaremos Promise.all para esperar todas las promesas, y para cada archivo zip, devolveremos una new Promise cuando termine llamando a resolve()

 const doSmth = async() => { await Promise.all(zip.map(async(relativePath: any, file: any) => { return new Promise(resolve => { const fs = require("fs"); let fileExists = fs.existsSync('data.json'); if (fileExists) { fs.readFileSync('data.json') console.log("file already exists") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } else { console.log("file didnt exist") fs.writeFileSync("data.json", JSON.stringify("")) resolve() } }) })) }

PD: No conté los paréntesis de cierre, edítelos en consecuencia.

PS2: su data.json debe estar vacío ya que está usando JSON.stringify("") que es una cadena vacía

si quieres hacer las cosas secuencialmente

 import fs from 'fs'; const fsPromises = fs.promises; const doSmth = async () => { return new Promise(async resolve => { for (let i = 0; i < zip.length; i++) { const file = zip[i]; if (await fsPromises.exists(file)) { await fsPromises.writeFile('data.json', file); } } resolve(); //End the function by returning a promise. }) }
about 4 years ago · Juan Pablo Isaza Relatório

0

No mezcle ni combine async/await con then . Parece que quieres hacer algo como esto.

 const fs = require('fs'); async function main() { await doSmth(); console.log('reached'); fs.readFileSync('data.json'); } main();

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda