DEV Community

ali
ali

Posted on

Node.js EventEmitter

Bugün sizlere EventEmitter sınıfından bahsedeceğim. Bildiğiniz gibi Node.js event-driven yani olay tabanlı bir programlama paradigmasına sahiptir. Bu demek oluyor ki biz bir takım eventler ve callbackler tanımlayacağız, program akışımızda eventlerimiz tetiklenecek ve işleme alınacak. Neden böyle bir yaklaşım benimsenmiş diye sorarsanız bu bir önceki yazımda daha detaylı anlattığım javascript' in single thread çalıştığı için asenkron işlemlerin bir şekilde bloklanmadan ele alınması gerektiği için.

Peki tüm bunların EventEmitter sınıfıyla ne alakası var diye sorarsanız, bu sınıf bizlere asenkron işlemleri kolayca ele alabileceğimiz bir yapı sunuyor. Aslında bu Observer Design Pattern uygulamasıdır.

const EventEmitter = require("events");
class Emitter extends EventEmitter {}

const myE = new Emitter();

myE.on("test", () => {
  console.log("event meydana geldi.");
});
myE.on("test", () => {
  console.log("event meydana geldi.");
});
myE.on("test", () => {
  console.log("event meydana geldi.");
});

console.log(myE.eventNames());

myE.emit("test");
Enter fullscreen mode Exit fullscreen mode

Yukarıda bir event nasıl tanımlanır ve çağrılır basit bir örneğini yazdım. Burada "on" metodu aslında boş bir objeye (master object) "test" adında bir dizi oluşturulur.

{
  test: [
    [Function (anonymous)],
    [Function (anonymous)],
    [Function (anonymous)]
  ]
}
Enter fullscreen mode Exit fullscreen mode

Burada eventName adıyla üç defa "on" metodu çağırılmış ve oluşan yapı yukarıdaki gibidir.
Tahmin edebileceğiniz gibi "emit" metodu ile "test" isimli event çağrılır. Burada bir foreach metodu test dizisini döner ve içindeki fonksiyonları çağırır.

Peki bu yapı nerelerde kullanıyor ?
Örneğin bir DOM eventinde;

const btn = document.getElementById("btn");
btn.addEventListener("click", () => {
  console.log("clicked");
});
Enter fullscreen mode Exit fullscreen mode

Örneğin Node.js uygulamasında bir Ağ isteğinde;

const http = require("http");
const req = http
  .request(
    {
      method: "GET",
      hostname: "jsonplaceholder.typicode.com",
      path: "/todos/1"
    },
    (res) => {
      res.on("data", (chunk) => {
        console.log(chunk.toString());
      });

      res.on("end", () => {
        console.log("response ended.");
      });
    }
  )
  .end();
Enter fullscreen mode Exit fullscreen mode

Top comments (0)