Khái niệm Callback trong NodeJS
1. Callback là gì?
Để giải thích Callback là gì chúng ta hãy xem một tình huống như sau:
Bạn tới một cửa hàng để mua một món đồ mà bạn yêu thích, nhân viên cửa hàng nói với bạn rằng hiện tại món đồ đó đã hết, bạn để lại số điện thoại và yêu cầu họ gọi lại ngay sau khi có hàng. Sau đó bạn có thể đi chơi hoặc làm một công việc nào đó và không cần quan tâm tới cửa hàng đó nữa, cho tới khi bạn nhận được điện thoại thông báo của hàng đã có món đồ mà bạn yêu thích.
Máy chủ NodeJS có thể nhận rất nhiều các yêu cầu (request) từ rất nhiều người dùng. Vì vậy để nâng cao khả năng phục vụ, tất cả các API của NodeJS được thiết kế hỗ trợ Callback. "callback" là môt hàm (function), nó sẽ được gọi khi NodeJs hoàn thành một tác vụ (task) cụ thể.
2. Ví dụ NodeJS Callback
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.
Blocking
readFileSync là một hàm đọc file một cách đồng bộ (synchronous), chính vì vậy trong khi hàm này đang thực thi nó sẽ chặn (block) chương trình thực thi các dòng code tiếp theo.
blocking-example.js
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");
Mở cửa sổ CMD và thực thi tập tin blocking-example.js.
node callback-examples/blocking-example.js
Và đây là kết quả mà bạn nhận được:
Non Blocking
Bạn nên sử dụng hàm readFile để đạt được hiệu suất tốt hơn cho chương trình. Hàm này đọc file một cách "không đồng bộ" (asynchronous), nó "không chặn" (non block) chương trình thực thi các dòng code tiếp theo, nói cách khác là chương trình không đợi hàm này hoàn thành. Nhưng khi hàm này thực hiện xong nhiệm vụ của nó, nó sẽ gọi tới hàm Callback.
// Read a file Asynchronous.
fs.readFile('C:\\test\\file1.txt', aCallbackFunction );
Xem ví dụ đầy đủ:
non-blocking-example.js
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");
Mở cửa sổ CMD và chạy tập tin non-blocking-example.js:
node callback-examples/non-blocking-example.js
Và đây là kết quả mà bạn nhận được:
Các hướng dẫn NodeJS
- Giới thiệu về NodeJs
- NPM là gì?
- Hướng dẫn NodeJS cho người mới bắt đầu
- Cài đặt trình soạn thảo Atom
- Cài đặt NodeJS trên Windows
- Hướng dẫn và ví dụ NodeJS Module
- Khái niệm Callback trong NodeJS
- Tạo một HTTP Server đơn giản với NodeJS
- Tìm hiểu về Event Loop trong NodeJS
- Hướng dẫn và ví dụ NodeJS EventEmitter
- Hướng dẫn và ví dụ NodeJS Buffer
- Kết nối cơ sở dữ liệu MySQL trong NodeJS
Show More