Node.js est un environnement d'exécution JavaScript léger basé sur un modèle d'E/S événementiel et non bloquant. Cependant, le modèle monothread de Node.js amène souvent les développeurs à se poser des questions : comment gérer les événements dans un seul thread ?
Pour mieux répondre à cette question, jetons d'abord un œil au mécanisme de boucle d'événements de Node.js.
Mécanisme de boucle d'événement de Node.js
Le modèle monothread de Node.js ne signifie pas qu'il n'y a qu'un seul thread en cours d'exécution. En fait, lorsque Node.js est démarré, un thread principal sera automatiquement créé pour traiter. Code JavaScript. Le mécanisme de boucle d'événements de Node.js correspond à la façon dont ce fil gère les événements.
Tout d’abord, jetons un coup d’œil au flux de base de la boucle événementielle.
Lorsque Node.js reçoit une requête ou que d'autres événements se produisent, il exécutera le code JavaScript correspondant et placera le code dans une pile d'appels pour exécution. Chaque fois qu'une fonction est exécutée, un cadre correspondant est ajouté en haut de la pile d'appels.
Si un événement est déclenché lors de l'exécution d'une fonction et porte une fonction de rappel correspondante, alors la fonction de rappel sera ajoutée à la table des événements. Event Table est une liste qui maintient la correspondance entre les événements et les fonctions de rappel correspondantes.
Lorsque le code de la pile d'appels est exécuté, Node.js entrera dans l'étape de boucle d'événement (Event Loop). La fonction de l'interrogation d'événements est de déterminer si un événement se produit dans la table des événements. Si tel est le cas, supprimez la fonction de rappel correspondante et exécutez-la.
Si l'interrogation d'événement trouve une fonction de rappel correspondant à l'événement, la fonction de rappel sera ajoutée à la pile d'appels et le code correspondant sera exécuté. Si un nouvel événement est déclenché pendant l'exécution de la fonction, il reviendra à la phase d'interrogation d'événement.
Lorsque Node.js constate qu'il n'y a plus d'événements à traiter dans la table des événements et qu'il n'y a actuellement aucun minuteur à attendre, le programme sera fermé. Sinon, il reviendra à la troisième étape et attendra que de nouveaux événements se produisent.
Comment gérer les événements ?
Le moyen le plus simple consiste à lier l'événement et la fonction de rappel ensemble, et à exécuter la fonction de rappel correspondante lorsque l'événement se produit. Nous pouvons regarder un exemple simple :
const EventEmitter = require('events'); const emitter = new EventEmitter(); emitter.on('event1', () => { console.log('event1 occured!'); }) emitter.emit('event1');
Dans cet exemple, nous définissons un EventEmitter et lions un événement 'event1' et la fonction de rappel correspondante. Lorsque nous déclenchons l'événement 'event1' via submit.emit('event1'), la fonction de rappel liée sera exécutée et 'event1 s'est produit !'
Une autre façon courante de gérer les événements consiste à utiliser Promise. Grâce à Promise, nous pouvons convertir les opérations asynchrones et les fonctions de rappel en un objet chaînable, et utiliser les méthodes then et catch pour gérer les situations de réussite et d'échec. Par exemple :
const promise = new Promise((resolve, reject) => { setTimeout(() => { resolve('result'); }, 1000); }); promise.then((result) => { console.log(result); }).catch((error) => { console.error(error); });
Dans cet exemple, nous créons un objet Promise, simulons une opération asynchrone et traitons les résultats de l'opération asynchrone via les méthodes then et catch.
Enfin, Node.js fournit également des modules et API intégrés pour gérer divers événements. Par exemple :
Conclusion
Dans le modèle monothread, le traitement des événements est l'une des fonctionnalités principales de Node.js. Grâce au mécanisme de boucle d'événements, Node.js peut gérer un grand nombre de requêtes simultanées et réaliser une programmation asynchrone efficace. Nous pouvons utiliser des fonctions de rappel, Promise, des modules et des API intégrés pour gérer divers événements afin de mettre en œuvre diverses applications complexes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!