Node.js: Callback
Callback (gọi lại) là một hàm tương đương không đồng bộ cho một hàm. Một hàm callback được gọi khi hoàn thành một nhiệm vụ nhất định. Node.js sử dụng nhiều lệnh gọi lại. Tất cả các API của Node.js đều được viết theo cách mà chúng hỗ trợ các lệnh gọi lại.
Ví dụ, một hàm đọc tệp có thể bắt đầu đọc tệp và trả điều khiển về môi trường thực thi ngay lập tức để lệnh tiếp theo có thể được thực hiện. Khi quá trình nhập/xuất tệp hoàn tất, nó sẽ gọi hàm callback trong khi truyền hàm callback, nội dung của tệp dưới dạng tham số. Vì vậy, không có việc chặn hoặc chờ đợi File I/O. Điều này làm cho Node.js có khả năng mở rộng cao, vì nó có thể xử lý một số lượng lớn các yêu cầu mà không cần đợi bất kỳ hàm nào trả về kết quả.
Ví dụ về mã chặn (blocking code)
Ta hãy tạo một tệp văn bản có tên input.txt với nội dung sau:
V1Study is giving self learning content to teach the world in simple and easy way!!!!!
Tạo tệp js có tên "demo_callback.js" và đưa vào mã sau:
var fs = require("fs"); var data = fs.readFileSync('input.txt'); console.log(data.toString()); console.log("Program Ended");
Thực thi file "demo_callback.js":
C:\Users\Your Name>node demo_callback.js
Kết quả:
V1Study is giving self learning content
to teach the world in simple and easy way!!!!!
Program Ended
Ví dụ về mã không chặn (non-blocking code)
Hãy sửa file "demo_callback.js" với nội dung sau:
var fs = require("fs"); fs.readFile('input.txt', function (err, data) { if (err) return console.error(err); console.log(data.toString()); }); console.log("Program Ended");
Bây giờ ta chạy thì kết quả sẽ là:
Program Ended
V1Study is giving self learning content
to teach the world in simple and easy way!!!!!
Hai ví dụ trên giải thích khái niệm và ý nghĩa của callback:
- Ví dụ đầu tiên cho thấy rằng chương trình sẽ chặn cho đến khi nó đọc tệp và sau đó nó tiến hành kết thúc chương trình.
- Ví dụ thứ hai cho thấy chương trình không đợi đọc tệp và tiến hành in "Program Ended" và đồng thời, chương trình không chặn vẫn tiếp tục đọc tệp.
Vì vậy, một chương trình chặn thực thi rất nhiều theo trình tự. Từ quan điểm lập trình, việc thực hiện logic sẽ dễ dàng hơn nhưng các chương trình không chặn không thực thi theo trình tự. Trong trường hợp một chương trình cần sử dụng bất kỳ dữ liệu nào để xử lý, thì nó nên được giữ trong cùng một khối để thực hiện tuần tự.