Introducció
L'Event Loop és un dels conceptes més fonamentals i importants en Node.js. És el mecanisme que permet a Node.js gestionar operacions asíncrones, com ara la lectura de fitxers, les peticions HTTP, i altres operacions d'entrada/sortida (I/O) sense bloquejar el fil principal d'execució.
Conceptes Clau
- Single-threaded: Node.js utilitza un sol fil d'execució per gestionar les operacions.
- Non-blocking I/O: Les operacions d'entrada/sortida no bloquegen el fil principal.
- Callbacks: Funcions que s'executen quan una operació asíncrona es completa.
- Event Loop: El bucle que gestiona l'execució de callbacks i altres operacions asíncrones.
Com Funciona l'Event Loop
L'Event Loop segueix un cicle continu de fases, cadascuna de les quals gestiona diferents tipus de callbacks. Les fases principals són:
- Timers: Executa callbacks de
setTimeout
isetInterval
. - Pending Callbacks: Executa callbacks de certes operacions del sistema.
- Idle, Prepare: Utilitzat internament per Node.js.
- Poll: Recupera nous I/O events; executa callbacks relacionats amb I/O.
- Check: Executa callbacks de
setImmediate
. - Close Callbacks: Executa callbacks de tancament, com
socket.on('close')
.
Diagrama de l'Event Loop
Fase | Descripció |
---|---|
Timers | Executa callbacks de setTimeout i setInterval . |
Pending Callbacks | Executa callbacks de certes operacions del sistema. |
Idle, Prepare | Utilitzat internament per Node.js. |
Poll | Recupera nous I/O events; executa callbacks relacionats amb I/O. |
Check | Executa callbacks de setImmediate . |
Close Callbacks | Executa callbacks de tancament, com socket.on('close') . |
Exemple Pràctic
Vegem un exemple pràctic per entendre millor com funciona l'Event Loop:
const fs = require('fs'); console.log('Inici del programa'); setTimeout(() => { console.log('Timeout de 0 ms'); }, 0); fs.readFile('fitxer.txt', 'utf8', (err, data) => { if (err) throw err; console.log('Lectura del fitxer completada'); }); setImmediate(() => { console.log('setImmediate'); }); console.log('Final del programa');
Explicació del Codi
- Inici del programa: Es mostra immediatament.
- Final del programa: Es mostra immediatament després de l'inici.
- Timeout de 0 ms: Es mostra després de la fase de
Poll
. - Lectura del fitxer completada: Es mostra després que la lectura del fitxer es completa (fase de
Poll
). - setImmediate: Es mostra després de la fase de
Poll
.
Exercici Pràctic
Exercici
Crea un programa que faci el següent:
- Mostri "Inici del programa".
- Utilitzi
setTimeout
amb 0 ms per mostrar "Timeout de 0 ms". - Utilitzi
setImmediate
per mostrar "setImmediate". - Utilitzi
fs.readFile
per llegir un fitxer i mostrar "Lectura del fitxer completada". - Mostri "Final del programa".
Solució
const fs = require('fs'); console.log('Inici del programa'); setTimeout(() => { console.log('Timeout de 0 ms'); }, 0); fs.readFile('fitxer.txt', 'utf8', (err, data) => { if (err) throw err; console.log('Lectura del fitxer completada'); }); setImmediate(() => { console.log('setImmediate'); }); console.log('Final del programa');
Errors Comuns
- Confusió entre
setTimeout
isetImmediate
: Recorda quesetImmediate
s'executa després de la fase dePoll
, mentre quesetTimeout
amb 0 ms s'executa després de la fase deTimers
. - No gestionar errors en operacions asíncrones: Sempre gestiona els errors en callbacks per evitar que el programa es bloquegi.
Consells Addicionals
- Utilitza
setImmediate
per assegurar-te que un callback s'executi després de la fase dePoll
. - Utilitza
process.nextTick
per executar un callback abans de la següent iteració de l'Event Loop.
Conclusió
L'Event Loop és el cor de Node.js, permetent la seva naturalesa asíncrona i no bloquejant. Comprendre com funciona és essencial per escriure aplicacions eficients i escalables en Node.js. Amb aquesta base, estàs preparat per explorar més sobre la programació asíncrona i altres conceptes avançats en Node.js.
Curs de Node.js
Mòdul 1: Introducció a Node.js
Mòdul 2: Conceptes Bàsics
Mòdul 3: Sistema de Fitxers i I/O
Mòdul 4: HTTP i Servidors Web
Mòdul 5: NPM i Gestió de Paquets
Mòdul 6: Framework Express.js
- Introducció a Express.js
- Configuració d'una Aplicació Express
- Middleware
- Routing en Express
- Gestió d'Errors
Mòdul 7: Bases de Dades i ORMs
- Introducció a les Bases de Dades
- Utilitzar MongoDB amb Mongoose
- Utilitzar Bases de Dades SQL amb Sequelize
- Operacions CRUD
Mòdul 8: Autenticació i Autorització
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb Mocha i Chai
- Proves d'Integració
- Depuració d'Aplicacions Node.js
Mòdul 10: Temes Avançats
Mòdul 11: Desplegament i DevOps
- Variables d'Entorn
- Utilitzar PM2 per a la Gestió de Processos
- Desplegar a Heroku
- Integració i Desplegament Continu