Mở đầu

Tiếp nối series Cùng học Nodejs. Ở bài trước mình đã đi qua Những Khái Niệm Cơ Bản trong Nodejs. Trong phần này, mình xin tiếp tục giới thiệu các bạn khái niệm EventEmitter và sự hữu ích của nó trong Nodejs.

Giới thiệu

Đối với những bạn đã học về Nodejs chắc hẳn cũng đã nghe qua ít nhất một lần về sự kiện này. Sự kiện emit hay EventEmitter là một sự kiện có sẵn bên trong Nodejs, hiện tại có rất nhiều cách để sử dụng EventEmitter này. Cùng mình khám phá sự thú vị của nó nhé!

Gán và Gọi sự kiện bằng Emit

Đầu tiên, để sử dụng được EventEmitter mình sẽ import nó vào bên trong file

Type ESM

import { EventEmitter } from 'node:events'

const event = new EventEmitter()

Type CLS

const { EventEmitter } = require('events')

const event = new EventEmitter()

Đối với sự kiện event.on() khi một hành động bất kỳ gọi đến tên của sự kiện được gán, hàm thực thi bên trong event.on() sẽ kích hoạt một cách đồng bộ.

main.js

event.on('clicked', () => {
  console.log('Hello There!')
})

Như ví dụ trên. Khi sự kiện clicked được kích hoạt mình sẽ nhận được log ‘Hello There!’

Mình sẽ thêm 1 chút thú vị tại đây nhé.

main.js

event.on('clicked', () => {
  console.log('Hello There!')
})

event.emit('clicked')
event.emit('clicked')
event.emit('clicked')

Như vậy, sự kiện clicked đã được kích hoạt 1 cách đồng bộ và mình đã nhận được 3 logs ‘Hello There!’

Truyền đối số

Quay trở lại ví dụ ban đầu ở mục trên.

Vậy nếu trường hợp function truyền vào sự kiện clicked có tham số thì sao?

main.js

event.on('clicked', (a, b, ...params) => {
  console.log('Hello There!')
})

Đến lúc sử dụng sự kiện emit. Mình sẽ truyền đối số cho hàm xử lý bên trong sự kiện clicked bằng event.emit()

main.js

event.on('clicked', (a, b, ...params) => {
  console.log('Hello There!')
  console.log(a + b)
  console.log(params)
})

event.emit('clicked', (1, 2, 3, 4))

Lúc này khi sự kiện clicked được kích hoạt bởi emit mình sẽ nhận được 3 dòng logs lần lượt là: Hello There!, 3, và [3, 4]

Tạo một sự kiện mới

Như đã biết, ở VanillaJS có rất nhiều sự kiện mở như click, dblclick, change… Mình sẽ tạo thêm một sự kiện error mới bằng event.emit() kèm dòng log ‘Error: Whoops! there was an error’. Xem nhé!

main.js

event.on('error', (err) => {
  console.log(`${err}! there was an error`)
})

event.emit('error', new Error('Whoops'))

Kết

Như đã thấy, mình đã đi qua các phần của EventEmitter một cách cơ bản nhất. Vì đây là phần cơ bản và dễ tiếp cận, nên có nhiều điều thú vị hơn nữa mình chưa đề cập đến trong bài viết. Các bạn có thể xem thêm tại đây.


Kaiz