Tìm hiểu về vòng lặp sự kiện trong Node.js

Node.js là một ứng dụng đơn luồng, nhưng nó có thể hỗ trợ đồng thời thông qua khái niệm event và callback. Mọi API của Node.js đều không đồng bộ và là một luồng đơn, chúng sử dụng các lệnh gọi hàm async để duy trì đồng thời. Node sử dụng observer pattern (mô hình giám sát). Node giữ một vòng lặp sự kiện và bất cứ khi nào một nhiệm vụ được hoàn thành, nó sẽ kích hoạt sự kiện tương ứng để báo hiệu cho hàm nghe sự kiện thực thi.

Lập trình hướng sự kiện (Event-Driven Programming)

Node.js sử dụng các sự kiện rất nhiều và đó cũng là một trong những lý do khiến Node.js khá nhanh so với các công nghệ tương tự khác. Ngay khi Node khởi động máy chủ của mình, nó chỉ cần khởi tạo các biến của nó, khai báo các hàm và sau đó chỉ cần chờ đợi sự kiện xảy ra.

Trong một ứng dụng hướng sự kiện, thường có một vòng lặp chính lắng nghe các sự kiện và sau đó kích hoạt chức năng callback khi một trong những sự kiện đó được phát hiện.

Vòng lặp sự kiện

Mặc dù các sự kiện trông khá giống với các callback, sự khác biệt nằm ở chỗ các hàm callback được gọi khi một hàm không đồng bộ trả về kết quả của nó, trong khi xử lý sự kiện hoạt động trên mô hình giám sát. Các chức năng nghe các sự kiện đóng vai trò là những Observer (giám sát). Bất cứ khi nào một sự kiện được kích hoạt, chức năng nghe của nó bắt đầu thực thi. Node.js có sẵn nhiều sự kiện được xây dựng thông qua mô-đun sự kiện và lớp EventEuctor được sử dụng để liên kết các sự kiện và trình lắng nghe sự kiện như sau –

// Import events module
var events = require('events');

// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

Sau đây là cú pháp để liên kết một trình xử lý sự kiện với một sự kiện –

// Bind event and event  handler as follows
eventEmitter.on('eventName', eventHandler);

Chúng ta có thể khởi động một sự kiện theo chương trình như sau –

// Fire an event 
eventEmitter.emit('eventName');

Ví dụ

Tạo một tệp js có tên main.js với đoạn code sau –

// Import events module
var events = require('events');

// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

// Create an event handler as follows
var connectHandler = function connected() {
   console.log('connection succesful.');
  
   // Fire the data_received event 
   eventEmitter.emit('data_received');
}

// Bind the connection event with the handler
eventEmitter.on('connection', connectHandler);
 
// Bind the data_received event with the anonymous function
eventEmitter.on('data_received', function() {
   console.log('data received succesfully.');
});

// Fire the connection event 
eventEmitter.emit('connection');

console.log("Program Ended.");

Bây giờ hãy thử chạy chương trình trên và kiểm tra đầu ra của nó –

$ node main.js

IT sẽ tạo ra kết quả sau –

connection successful.
data received successfully.
Program Ended.

Ứng dụng Node hoạt động như thế nào?

Trong Ứng dụng Node, bất kỳ hàm async nào cũng chấp nhận callback làm tham số cuối cùng và hàm callback chấp nhận một error (lỗi) là tham số đầu tiên. Hãy xem lại ví dụ trước một lần nữa. Tạo một tệp văn bản có tên input.txt với nội dung sau.

Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

Tạo một tệp js có tên main.js có code sau –

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
   if (err) {
      console.log(err.stack);
      return;
   }
   console.log(data.toString());
});
console.log("Program Ended");

Ở đây fs.readFile () là một hàm async có mục đích là để đọc một tệp. Nếu xảy ra lỗi trong quá trình đọc, thì err object (đối tượng err) sẽ chứa error tương ứng, dữ liệu khác sẽ chứa nội dung của tệp. readFile chuyển err và data cho hàm callback sau khi thao tác đọc hoàn tất, cuối cùng sẽ in nội dung.

Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!

 

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *