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

  1. Single-threaded: Node.js utilitza un sol fil d'execució per gestionar les operacions.
  2. Non-blocking I/O: Les operacions d'entrada/sortida no bloquegen el fil principal.
  3. Callbacks: Funcions que s'executen quan una operació asíncrona es completa.
  4. 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:

  1. Timers: Executa callbacks de setTimeout i setInterval.
  2. Pending Callbacks: Executa callbacks de certes operacions del sistema.
  3. Idle, Prepare: Utilitzat internament per Node.js.
  4. Poll: Recupera nous I/O events; executa callbacks relacionats amb I/O.
  5. Check: Executa callbacks de setImmediate.
  6. 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

  1. Inici del programa: Es mostra immediatament.
  2. Final del programa: Es mostra immediatament després de l'inici.
  3. Timeout de 0 ms: Es mostra després de la fase de Poll.
  4. Lectura del fitxer completada: Es mostra després que la lectura del fitxer es completa (fase de Poll).
  5. setImmediate: Es mostra després de la fase de Poll.

Exercici Pràctic

Exercici

Crea un programa que faci el següent:

  1. Mostri "Inici del programa".
  2. Utilitzi setTimeout amb 0 ms per mostrar "Timeout de 0 ms".
  3. Utilitzi setImmediate per mostrar "setImmediate".
  4. Utilitzi fs.readFile per llegir un fitxer i mostrar "Lectura del fitxer completada".
  5. 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

  1. Confusió entre setTimeout i setImmediate: Recorda que setImmediate s'executa després de la fase de Poll, mentre que setTimeout amb 0 ms s'executa després de la fase de Timers.
  2. 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 de Poll.
  • 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

Mòdul 7: Bases de Dades i ORMs

Mòdul 8: Autenticació i Autorització

Mòdul 9: Proves i Depuració

Mòdul 10: Temes Avançats

Mòdul 11: Desplegament i DevOps

Mòdul 12: Projectes del Món Real

© Copyright 2024. Tots els drets reservats