Quiero leer los tres archivos txt y sumar los resultados de texto devueltos por realFile(), a continuación se muestra mi código de devolución de llamada. ¿Cómo usamos Promise y .then() para sumar todo el texto?
fs.readFile('./a.txt', 'utf8', (err, data) => { if(err) console.log(err) fs.readFile('./b.txt', 'utf8', (err, newData) => { if(err) console.log(err) fs.readFile('./c.txt', 'utf8',(err, newestData) => { if (err) console.log(err) console.log(data+newData+newestData) }) }) })Puede usar la API fs.promises para obtener métodos prometidos.
Luego, solo haz un Promise.all :
const p1 = fs.promises.readFile('./a.txt', 'utf8') const p2 = fs.promises.readFile('./b.txt', 'utf8') const p3 = fs.promises.readFile('./c.txt', 'utf8') Promise.all([p1, p2, p3]) .then(([v1, v2, v3]) => console.log(v1 + v2 + v3)) .catch(e => console.error(e))También puede evitar la repetición con matrices:
const files = ['./a.txt', './b.txt', './c.txt'] Promise.all( files.map(file => fs.promises.readFile(file, 'utf8')) ) .then(([v1, v2, v3]) => console.log(v1 + v2 + v3)) .catch(e => console.error(e)) Si realmente está buscando algo con múltiples .then() s, puede hacerlo de esta manera (aunque no es mucho mejor que su devolución de llamada original):
fs.promises.readFile('./a.txt', 'utf8').then(v1 => fs.promises.readFile('./b.txt', 'utf8').then(v2 => fs.promises.readFile('./c.txt', 'utf8').then(v3 => console.log(v1+v2+v3) ) ) ) .catch(e => console.error(e))Verifique el fragmento de código a continuación. He agregado lógica para ambas promesas y async/await
const fs = require('fs'); const util = require("util"); const readFile = util.promisify(fs.readFile); // return promise which can resolved later // data is array of promise in same order of let data = Promise.all([ readFile('file.txt', 'utf8'), readFile('file.txt', 'utf8'), readFile('file.txt', 'utf8') ]) data.then(([data1, data2, data3]) => { console.log(data1, data2, data3) }).catch(error => console.log(error))Podemos lograr esto usando async/await incluso con una sintaxis simple
const fetchData = async () => { const data1 = await readFile('file.txt', 'utf8'); const data2 = await readFile('file.txt', 'utf8'); const data3 = await readFile('file.txt', 'utf8'); console.log(data1, data2, data3); } fetchData();