Những điều cần biết về lập trình hướng sự kiện trong Node.js

Kiến trúc hướng sự kiện mạnh mẽ của Node là một trong số ưu điểm mạnh nhất. Dưới đây là mọi điều bạn cần biết về lập trình hướng sự kiện trong Node.js.

Lập trình Node.js

Khi xây dựng ứng dụng phần mềm bất kỳ, một quyết định quan trọng liên quan tới việc chọn mô hình phù hợp cho code của bạn.

Lập trình hướng đối tượng là lựa chọn tốt cho những ứng dụng tương tác phản hồi với hành động của người dùng mà có thể xảy ra theo thứ tự bất kỳ. Nó là một mô hình phổ biến hơn với các app GUI so với chương trình dòng lệnh hoặc code hệ thống được nhúng.

Sự kiện hay event là gì?

Bạn có thể nghĩ tới một sự kiện là hành động hay số lần xuất hiện code có thể nhận ra và phản hồi. Hệ thống này hoặc một người dùng có thể kích hoạt sự kiện và code sẽ luôn đăng ký một hàm để xử lý nó.

Một ví dụ sự kiện cơ bản là click vào nút bấm để triển khai hành động cụ thể. Tác vụ click nút bấm chạy một sự kiện, còn hàm chạy khi click diễn ra là trình nghe hay xử lý sự kiện.

Lập trình hướng sự kiện là gì?

Lập trình hướng sự kiện là một mô hình lập trình mà quá trình chạy app tùy thuộc vào các sự kiện xảy ra, thay vì tuân theo trình tự nghiêm ngặt.

Mô hình này chủ yếu được dùng khi xây dựng giao diện người dùng và app tại thời gian thực, nơi một sự kiện như hành động của người dùng sẽ kích hoạt một tác vụ trong hệ thống.

Mô hình này rất phổ biến khi xây dựng app web, nơi trình nghe sự kiện chạy lúc người dùng tương tác với Document Object Model (DOM).

Ảnh sau minh họa cách hoạt động của dòng lập trình hướng sự kiện. Khi một sự việc diễn ra, kênh sự kiện tiếp nhận nó và chuyển vào trình nghe sự kiện phù hợp để xử lý:

Mô hình lập trình hướng sự kiện

Lập trình hướng sự kiện trong Node.js

Lặp sự kiện JavaScript là một khái niệm cơ bản đằng sau tính chất không đồng bộ của thời gian chạy Node.js. Một kiến trúc hướng sự kiện dùng mô đun EventEmitter có sẵn để tạo điều kiện cho luồng thực thi liền mạch.

Với lập trình hướng sự kiện, Node.js cho phép bạn tạo các ứng dụng bên server mà có thể xử lý tương tác người dùng, hoạt động I/O và xử lý dữ liệu tại thời gian thực. Điều này xảy ra theo cách không chặn, nhằm nâng cao hiệu suất và trải nghiệm mượt mà hơn cho người dùng.

Triển khai lập trình hướng sự kiện trong Node.js thật dễ dàng khi bạn hiểu cơ bản về xác định, kích hoạt và xử lý sự kiện.

Class EventEmitter

Với class EventEmitter trong Node.js, bạn có thể tạo các sự kiện tùy chỉnh và gắn các trình nghe sự kiện để xử lý chúng. Để dùng class này trong code, nhập nó từ mô đun events như sau:

// CommonJS
const { EventEmitter } = require("events")

// ES6
import { EventEmitter } from "events"

Class này và các hàm thành phần của nó sau đó sẽ có sẵn cho bạn sử dụng trong app. Để bắt đầu chạy và xử lý sự kiện, khởi tạo một phiên bản mới của class EventEmitter.

Ví dụ:

const FoodEvents = new EventEmitter()

Điều này tạo một đối tượng trình phát mới gọi là FoodEvents, có thể chạy sự kiện và đăng ký trình nghe. Class EventEmmitter cung cấp 3 phương thức cho việc nghe một sự kiện: on, addListener, và once.

Phương thức on là hàm cơ bản nhất để thêm trình nghe sự kiện, và addListener hoạt động chính xác theo cách này. Cả hai đều chấp nhận tên sự kiện và hàm gọi lại làm đối số. Callback thực sự là một chức năng xử lý. Bạn có thể dùng on addListener thay thế cho nhau.

Sau đây là cách bạn xử lý sự kiện bằng phương thức on:

FoodEvents.on("cookie_ready", (data) => {
    console.log("Cookie ready for packaging, data received: ", data);
})

Dùng addListener làm lựa chọn thay thế trực tiếp cho on:

FoodEvents.addListener("cookie_ready", (data) => {
    console.log(
        "Cookie will now be packaged and sent out, data received: ",
        data
    );
})

Cả hai ví dụ này đều sẽ thêm callback vào mảng của các trình nghe sự kiện cho event cookie_ready. Nếu dùng cả hai, các callback của chúng sẽ chạy theo thứ tự.

Phương thức once kích hoạt trình nghe sự kiện một lần, chạy sự kiện tiếp theo. Sau đó, hệ thống này sẽ loại bỏ nó khỏi mảng của trình nghe sự kiện.

Đây là cách dùng once để xử lý sự kiện một lần:

FoodEvents.once("cookie_sent", (data) => {
    console.log("Cookie is sent out, data received: ", data);
})

Trong trường hợp này, emitter sẽ chỉ nghe sự kiện cookie_sent một lần và loại bỏ trình xử lý sau khi nó chạy.

Đừng quên điều đó, đối với trình nghe để xử lý sự kiện, ứng dụng này phải loại bỏ sự kiện tại một số điểm. Đây là một số code mẫu để chạy sự kiện cookie_ready bằng phương thức emit:

function bakeCookie() {
    console.log("Cookie is baking, almost ready...")

    setTimeout(() => {
        FoodEvents.emit("cookie_ready", { flavor: "vanilla cookie" })
    }, 3000)
}

bakeCookie()

Khi chạy code in thông báo trong console rằng cookie đang được “chế biến”, đợi 3 giây và chạy event cookie_ready, bạn sẽ nhận được kết quả như ảnh bên dưới:

Kết quả chạy cookie

Điều này thể hiện cách trình nghe sự kiện chạy theo thứ tự bạn đăng ký chúng.

Class EventEmitter cung cấp nhiều phương thức hơn, bao gồm:

  • removeListener: Loại bỏ một phiên bản của trình nghe sự kiện khỏi mảng nghe sự kiện. Phương thức off cũng có sẵn cho mục đích này.
  • prependListener: Phương thức này cũng dăng ký một trình nghe sự kiện nhưng, thay vì thêm nó vào cuối mảng trình nghe sự kiện, nó được thêm vào phần bắt đầu. Sau đó, nó sẽ chạy trước bất kỳ trình nghe sự kiện khác mà có thể bạn đã đăng ký.
  • prependOnceListener: Nó hoạt động giống như prependListener, nhưng trình nghe sự kiện chỉ chạy một lần, như trong trường hợp của once.
  • removeAllListeners: Hàm này loại bỏ tất cả trình nghe sự kiện đã đăng ký cho một sự kiện được đặt tên cụ thể, hoặc tất cả trình nghe sự kiện nếu bạn chuyển sang không đối số cho nó.
  • Listeners: Trả về một mảng trình nghe sự kiện của tên sự kiện bạn chuyển sang nó dưới dạng đối số.
  • eventNames: Bạn có thể dùng hàm này để lấy toàn bộ tên sự kiện đã đăng ký một trình nghe sự kiện.
  • setMaxListeners: Node.js mặc định phát một cảnh báo khi bạn đăng ký hơn 10 trình nghe cho một sự kiện, để ngăn rò rỉ bộ nhớ. Bạn có thể điều chỉnh giá trị mặc định này bằng setMaxListeners. Bạn cũng có thể kiểm tra giá trị này bằng getMaxListeners.

Gói events cung cấp chức năng toàn diện cho lập trình hướng sự kiện trong Node.js.

Một số phương pháp lập trình hướng đối tượng tốt nhất

  • Dùng tên mô tả chính xác cho các sự kiện để kích hoạt codebase gọn gàng và dễ bảo trì.
  • Áp dụng xử lý lỗi và ghi nhật ký tốt, để cho phép gỡ lỗi dễ dàng.
  • Trành lồng nhiều lệnh callback khi viết các trình nghe sự kiện. Thay vào đó, hãy dùng các promise JavaScript.
  • Đừng tạo quá nhiều trình nghe sự kiện cho một sự kiện. Thay vào dó, xem xét tách các sự kiện và xâu chuỗi chúng.

Trên đây là những điều bạn cần biết về lập trình hướng sự kiện trong Node.js. Hi vọng bài viết hữu ích với các bạn.

Thứ Sáu, 29/09/2023 11:21
51 👨 454
0 Bình luận
Sắp xếp theo