Node.js: Vòng lặp sự kiện
Node.js là một ứng dụng đơn luồng, nhưng nó có thể hỗ trợ đồng thời (concurrency) thông qua khái niệm event (sự kiện) và callback (gọi lại). Mọi API của Node.js là không đồng bộ và là một luồng đơn, chúng sử dụng các lệnh gọi hàm không đồng bộ để duy trì sự đồng thời. Node.js sử dụng mẫu observer. Node thread 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 lắng nghe sự kiện thực thi.
Lập trình theo hướng sự kiện
Node.js sử dụng nhiều sự kiện và đó cũng là một trong những lý do tại sao Node.js khá nhanh so với các công nghệ tương tự khác. Ngay sau khi Node khởi động máy chủ của nó, 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 đợ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 một hàm gọi lại khi một trong những sự kiện đó được phát hiện.
Mặc dù các sự kiện trông khá giống với các hàm callback, nhưng 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 việc xử lý sự kiện hoạt động trên mẫu quan sát (observer). Các hàm lắng nghe các sự kiện hoạt động như các observer. Bất cứ khi nào một sự kiện được kích hoạt, hàm lắng nghe của nó sẽ bắt đầu thực thi. Node.js có nhiều sự kiện tích hợp sẵn thông qua mô-đun events và lớp EventEmitter được sử dụng để liên kết sự kiện và trình nghe sự kiện như sau:
// đưa vào module events var events = require('events'); // tạo một đối tượng của EventEmitter var eventEmitter = new events.EventEmitter();
Sau đây là cú pháp để liên kết trình xử lý sự kiện với một sự kiện:
// nạp sự kiện và trình xử lý sự kiện như sau: eventEmitter.on('eventName', eventHandler);
Kích hoạt sự kiện như sau:
// kích hoạt sự kiện: eventEmitter.emit('eventName');
Vi dụ
Tạo tệp js có tên demo_events.js với mã sau:
var events = require('events'); var eventEmitter = new events.EventEmitter(); // tạo 1 trình xử lý sự kiện: var connectHandler = function connected() { console.log('connection succesful.'); // kích hoạt sự kiện data_received: eventEmitter.emit('data_received'); } // nạp sự kiện connection tới trình xử lý sự kiện eventEmitter.on('connection', connectHandler); // nạp sự kiện data_received tới hàm nặc danh: eventEmitter.on('data_received', function() { console.log('data received succesfully.'); }); // kích hoạt sự kiện connection eventEmitter.emit('connection'); console.log("Program Ended.");
Thực thi file:
C:\Users\Your Name>node demo_events.js
Kết quả:
connection successful.
data received successfully.
Program Ended.
Ứng dụng Node.js hoạt động như thế nào?
Trong ưng dụng Node.js, bất kỳ hàm không đồng bộ nào cũng chấp nhận một callback làm tham số cuối cùng và một hàm callback chấp nhận một lỗi là tham số đầu tiên. Hãy xem lại ví dụ ở bài học về callback một lần nữa.
Ở đây fs.readFile() là một hàm không đồng bộ có mục đích là để đọc một tệp. Nếu lỗi xảy ra trong quá trình đọc, thì đối tượng err sẽ chứa lỗi tương ứng, dữ liệu khác sẽ chứa nội dung của tệp. readFile chuyển lỗi và dữ liệu đến hàm callback sau khi hoạt động đọc hoàn tất, cuối cùng sẽ in nội dung:
Program Ended
V1Study is giving self learning content
to teach the world in simple and easy way!!!!!