Node.js usa subprocesos del grupo de trabajadores para realizar operaciones de E/S. Si necesito contar la cantidad de caracteres en muchos archivos al mismo tiempo (usando Promise.all ), ¿es seguro actualizar la variable totalNumberOfChars que es común a todas las operaciones de lectura de archivos prometidos? Debido a que se puede usar un subproceso separado para cada operación de lectura, ¿ totalNumberOfChars puede ser incorrecto?
Este es el código:
const fs = require("fs"); const util = require("util"); const readFileAsync = util.promisify(fs.readFile); /** * * @param {Array} pathsToFiles - array of paths to files */ const main = async (pathsToFiles) => { let totalNumberOfChars = 0; await Promise.all( pathsToFiles.map(async (path) => { const chars = await readFileAsync(path); totalNumberOfChars += chars.length; }) ); console.log("totalNumberOfChars", totalNumberOfChars); }; main(['/home/a.txt', '/home/b.txt'])Esto es seguro, porque lo que hay dentro de esta función:
pathsToFiles.map(async (path) => { const chars = await readFileAsync(path); totalNumberOfChars += chars.length; })se ejecuta sincrónicamente, lo que significa que su archivo se lee sincrónicamente (¡nuevamente, dentro de esa devolución de llamada!) Y también está agregando al contador sincrónicamente. Entonces, después de la ejecución de la función "principal", recibirá la respuesta correcta.