Skip to the content.

🐱 Node.js

🌟 Les diffĂ©rents modules core

Events

Le module Events va permettre de crĂ©er et manipuler un des Ă©lĂ©ments les plus importants de Node.js: l’Event Emitter (il y a aussi depuis peu Event Target qui est une API compatible avec le navigateur).

Les diffĂ©rents modules de Node.js comme HTTP, Net, Child process ainsi que les Streams sont majoritairement construits Ă  l’aide d’Event Emitter.

const fs = require("node:fs");

const stream = fs.createReadStream("./myFile.txt");
stream.on("data", (chunk) => console.log(chunk));
stream.on("end", () => console.log("stream finished!"));
stream.on("error", console.error);

Exemple ci-dessus avec un Read Stream ou nous exploitons les Ă©vĂšnements “data”, “end” ou encore “error” (merci de pas reproduire ce code en production ^^).

Ce sont des structures complĂštement Synchrone dans lesquelles nous pouvons lier un nom d’évĂšnement (emitter) Ă  une ou plusieurs functions (listeners). Les Ă©vĂšnements qui seront Ă©mis sont gĂ©rĂ©s en FIFO (First in First out).

Cela va nous permettre de mettre en place diverses patterns ou le code fonctionnera par le biais de communication entre différents objets.

import { EventEmitter, once } from "node:events";

const ee = new EventEmitter();
setImmediate(() => ee.emit("foo", "hello world!"));

const [message] = await once(ee, "foo");
console.log(message);

Une class en JavaScript peut s’étendre d’un EventEmitter.

import { EventEmitter } from "node:events";

class User extends EventEmitter {
    sayHello() {
        this.emit("hello");
    }
}
const bob = new User();
bob.on("hello", () => console.log("bob say hello!"));
bob.sayHello();

C’est pratique si vous voulez construire un systĂšme modulaire ou diffĂ©rent objets (class) communiquent par le biais de messages (les Addons dans SlimIO utilisent beaucoup ce principe).

Il est aussi bon de noter que depuis quelques versions la mĂ©thode “on” d’events est AsyncIterable.

import { EventEmitter, on } from "node:events";

const ee = new EventEmitter();
setImmediate(() => {
    ee.emit("data", "foo");
    ee.emit("data", "bar");
});

for await (const [data] of on(ee, "data")) {
    console.log(data);
}

[!NOTE] Node.js supporte maintenant aussi l’API Web EventTarget


âŹ…ïž 🌟 Les diffĂ©rents modules core: Console | âžĄïž 🌟 Les diffĂ©rents modules core: Path