NodeJS cơ bản cho người mới bắt đầu

Bài 5: NodeJS - Khái niệm callbacks

1. Callback là gì?

Callback có tính chất không đồng bộ tương đương cho một hàm. Một hàm callback được gọi khi hoàn thành một nhiệm vụ cụ thể. Tất cả các API của Node đều được viết theo các cách của hàm callback.
Ví dụ, một hàm để đọc file bắt đầu với việc đọc file và trả về phần điều khiển để môi trường thực hiện quyết định lệnh tiếp theo có thể thực thi. Khi phần I/O (đọc/ghi) file được hoàn thành, nó sẽ gọi về một hàm callback, với nội dung của file là tham số. Do đó sẽ không có blocking hoặc chờ khi đọc/ghi File. Nó làm cho Node.js có hiệu năng cao hơn, như có số lượng request cao hơn mà không cần phải chờ kết quả trả về.

2. Ví dụ Blocking Code

Trong NodeJS các API được thiết kế để hỗ trợ Callback. Giả sử rằng bạn đang viết một chương trình để đọc 2 tập tin. Để làm việc này bạn sử dụng module fs, nó cung cấp cho bạn 2 hàm để đọc file là readFile và readFileSync. Chúng ta sẽ tìm hiểu sự khác biệt giữa 2 hàm này.
Tạo một file js với tên main.js với nội dung sau đây:
var fs = require("fs");
 
// -----> Read file 1:
console.log("\n");
console.log("Read File 1");
 
var data1 = fs.readFileSync('C:\\test\\file1.txt');
 
console.log("- Data of file 1: ");
console.log(data1.toString());
 
 
// -----> Read file 2:
console.log("\n");
console.log("Read File 2");
 
var data2 = fs.readFileSync('C:\\test\\file2.txt');
console.log("- Data of file 2: ");
console.log(data2.toString());
 
 
console.log("\n");
console.log("Program Ended");
Bây giờ chạy lệnh sau để xem kết quả:
$ node main.js
Kết quả:

3. Ví dụ Non-Blocking Code

Tạo một file với tên input.txt với nội dung sau đây:
QTM la trang Web huong dan cac bai lap trinh hoan toan mien phi cho tat ca moi nguoi!!!!!
Cập nhật main.js với dòng code sau:
var fs = require("fs");
 
// A Callback function!
function readFinishedFile1(err, data)  {
   if (err) console.log(err);
   console.log("- Data of file 1: ");
   console.log(data.toString());
}
 
// A Callback function!
function readFinishedFile2(err, data)  {
   if (err) console.log(err);
   console.log("- Data of file 2: ");
   console.log(data.toString());
}
 
// -----> Read file 1:
console.log("\n");
console.log("Read File 1");
 
fs.readFile('C:\\test\\file1.txt', readFinishedFile1);
 
// -----> Read file 2:
console.log("\n");
console.log("Read File 2");
 
fs.readFile('C:\\test\\file2.txt', readFinishedFile2);
 
console.log("\n");
console.log("Program Ended \n");
Bây giờ chạy main.js để xem kết quả:
$ node main.js
Kết quả:
Hai ví dụ trên giải thích định nghĩa cách gọi blocking và non-blocking. Ví dụ đầu tiên chỉ ra rằng chương trình khóa cho đến khi nó đọc file và chỉ tiếp tục chạy vài giây sau đó, chương trình thứ 2 không đợi cho việc đọc file và tiếp tục in "Ket thuc chuong trinh" cùng thời điểm thực hiện chương trình.