Cuando se usa await en una función con devolución de llamada, como fs.writeFile, await no espera a que se ejecute el código dentro de la devolución de llamada. Por ejemplo:
const fs = require("fs") async function test() { for (let i = 0; i < 3; i++) { console.log(`processing ${i}`) const fileName = `${i}.json` await fs.writeFile(fileName, JSON.stringify(i), err => { if (err) throw err console.log(`file ${i} is written`) }) console.log(`${i} is done.`) } } test()El código anterior produce:
processing 0 0 is done. processing 1 1 is done. processing 2 2 is done. file 1 is written file 0 is written file 2 is writtenen vez de:
processing 0 file 0 is written 0 is done. processing 1 file 1 is written 1 is done. processing 2 file 2 is written 2 is done.¿Alguien podría explicar por qué await no permite que termine de escribir el archivo antes de continuar?
Esto se debe a que writeFile no devuelve una Promise y await una resolución de Promesa antes de suspender la ejecución. Puede actualizar a la última versión de writeFile o escribir una función que devuelva una promise :
const fs = require("fs") async function test() { for (let i = 0; i < 3; i++) { console.log(`processing ${i}`) const fileName = `${i}.json` await writeToFile(fileName, i); console.log(`${i} is done.`) } } function writeToFile(fileName, index) { return new Promise((resolve, reject) => { fs.writeFile(fileName, JSON.stringify(index), err => { if (err) { // denotes failure reject(err) } console.log(`file ${index} is written`); // denotes success resolve(true) }) }); } test()