De acuerdo con esto, primero se debía imprimir "1" y luego "2". PERO está dando una salida incorrecta.
fs.readdir("./my_stocks", (err, files) => { for(each in files){ var file=files[each]; if(file!='portfolio.js'){ var fn="./my_stocks/"+file; fs.readFile(fn,(err,data)=>{ var arr=data.toString().split('\n'); console.log(1); fs.appendFile("./my_stocks/portfolio.js",JSON.stringify(stock_detail),(err)=>{ if(err) throw err; }); }); console.log(2) } } });producción:
2 2 1 1
El "bloque interno" es una devolución de llamada a la instrucción fs.readFile . Lo que sucede es
fs.readFile se ejecuta e inicia una lectura asíncrona del archivo. Si desea evitar tal asincronía, puede usar fs.readFileSync (y también fs.readdirSync ). Pero esto ralentizará la ejecución general, porque los archivos se leen uno tras otro, no en paralelo. Si el orden de las entradas en su portfolio.js no importa, es preferible la asincronía.
Tenga en cuenta, sin embargo, que agregar varios stock_details a un portfolio.js no hace que Javascript sea válido en general:
{"Stock 1":100}{"Stock 2":200}Suponiendo que cada archivo contiene líneas como
A: 1 B: 2 (sin una nueva línea final), puede leerlos y procesarlos de forma asíncrona con el " sabor de promesas " del paquete fs :
const fs = require("fs/promises"); fs.readdir("./my_stocks") .then(function(files) { var promises = []; for(each in files){ var file=files[each]; if(file!='portfolio.js'){ var fn="./my_stocks/"+file; promises.push(fs.readFile(fn) .then(data => data.toString().split('\n'))); } } return Promise.all(promises); }) .then(portfolio => fs.writeFile("./my_stocks/portfolio.js", JSON.stringify(portfolio)));