Node.js là ứng dụng đơn luồng nhưng có hỗ trợ việc xử lí đồng thời thông qua các định nghĩa về sự kiện và callback. Như tất cả các API của Node.js có tính chất không đồng bộ và được xử lí đơn luồng, nó sử dụng hàm async để duy trì sự đồng thời. Node.js sử dụng Observer Pattern. Các Thread trong Node.js giữ một Event Loop và bất cứ khi nào có tác vụ nào hoàn thành, nó sẽ kích hoạt sự kiện tương ứng để báo cho Event Listener sẵn sàng thực hiện..
1. Event Driven trong Node.js
Node.js sử dụng rất nhiều sự kiện, đó là lý do tại sao Node.js khá nhanh so với các sản phẩm công nghệ khác. Ngay khi Node khởi động Server của nó, nó sẽ nhanh chóng khởi tạo các biến, khai báo các hàm và sau đó đơn giản là chờ đợi các sự kiện xảy ra.
Trong ứng dụng xử lý sự kiện, nhìn chung vòng lặp chính lắng nghe các sự kiện, và sau đó trigger đến hàm callback khi một trong những sự kiện được phát hiện.
Trong khi các Event là khá tương tự như các hàm callback . Điểm khác nhau nằm ở chỗ, hàm callback gọi khi một hàm không đồng bộ và trả về kết quả của nó trong khi phần xử lí sự kiện làm việc trên Observer Pattern. Hàm này sẽ lắng nghe các sự kiện, đóng vai trò như một Observers (Người quan sát). Bất cứ khi nào một sự kiện phát sinh, các hàm Listener của nó sẽ bắt đầu thực thi. Node.js có nhiều sự kiện có sẵn thông qua events Module và lớpEventEmitter có thể dựa vào để bind sự kiện và lắng nghe sự kiện.
Trước khi sử dụng event Module, bạn sử dụng phương thức require() để khai báo như sau:
// Import events module
var events = require('events');
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();
Sau đó, để gắn kết Event Handler với một sự kiện, bạn sử dụng cú pháp sau:
// Bind event and event handler as follows
eventEmitter.on('eventName', eventHandler);
Bạn có thể kích hoạt một sự kiện bởi sử dụng phương thức emit() của EventEmitter:
// Fire an event
eventEmitter.emit('eventName');
2. Ví dụ minh họa
Tạo một file js với tên là main.js có đoạn code sau:
Live Demo
// 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.");
Chạy chương trình trên như sau:
Kết quả là:
connection successful.
data received successfully.
Program Ended.
3. Cách Node.js hoạt động
Trong ứng dụng Node.js, một hàm không đồng bộ chấp nhận một callback như tham số cuối cùng và hàm callback chấp nhận error như tham số đầu tiên. Cùng xem lại ví dụ trước. Tạo một text file với tên input.txt với nội dung sau đây:
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!
Trong ví dụ này, mình sử dụng fs Module để xử lý các hoạt động File I/O (mình sẽ trình bày trong chương sau). Đầu tiên, bạn tạo một file js với tên là main.js như 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 không đồng bộ với mục đích để đọc file. Nếu có một lỗi nào đó trong quá trình đọc file, đối tượng err sẽ chứa lỗi đó, nếu không thì data sẽ chứa các phần nội dung của file đó. Hàm readFile truyền err và data đến hàm callback sau khi quá trình đọc file đã hoàn thành, và cuối cùng sẽ in ra nội dung.
Program Ended
Tutorials Point is giving self learning content
to teach the world in simple and easy way!!!!!