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
setTimeoutisetInterval. - 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
setTimeoutamb 0 ms per mostrar "Timeout de 0 ms". - Utilitzi
setImmediateper mostrar "setImmediate". - Utilitzi
fs.readFileper 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
setTimeoutisetImmediate: Recorda quesetImmediates'executa després de la fase dePoll, mentre quesetTimeoutamb 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
setImmediateper assegurar-te que un callback s'executi després de la fase dePoll. - Utilitza
process.nextTickper 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
