Gọi lại là gì?
Callback là phần không thể thiếu trong xử lý bất đồng bộ. Một chức năng gọi lại(callback) được gọi khi hoàn thành một nhiệm vụ nhất định – thường liên quan đến các tác vụ IO như đọc file/gọi ajax/query database . . . . Nodejs sử dụng nhiều các cuộc gọi lại. Tất cả các API của Nodejs được viết theo cách mà chúng hỗ trợ gọi lại.
Ví dụ: một chức năng đọ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 để có thể thực hiện lệnh tiếp theo. Khi tệp I/O hoàn tất, nó sẽ gọi hàm gọi lại trong khi truyền hàm gọi lại, nội dung của tệp dưới dạng tham số. Vì vậy, không có chặn hoặc chờ Tệp 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 yêu cầu mà không cần đợi bất kỳ chức năng nào trả về kết quả.
Ví dụ về xử lý tuần tự (Blocking Code )
Tạo một tệp văn bản có tên input.txt với nội dung sau –
Tutorials Point is giving self learning content to teach the world in simple and easy way!!!!!
Tạo một tệp js có tên main.js với đoạn mã sau –
var fs = require("fs"); var data = fs.readFileSync('input.txt'); console.log(data.toString()); console.log("Program Ended");
Bây giờ hãy chạy main.js để xem kết quả –
$ node main.js
Xác minh đầu ra.
Tutorials Point is giving self learning content to teach the world in simple and easy way!!!!! Program Ended
Ví dụ về bất đồng bộ (bất tuần tự – Non-Blocking Code)
Tạo một tệp văn bản có tên input.txt với nội dung sau.
Tutorials Point is giving self learning content to teach the world in simple and easy way!!!!!
Cập nhật main.js để có đoạn mã 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ờ hãy chạy main.js để xem kết quả –
$ node main.js
Xác minh đầu ra.
Program Ended Tutorials Point is giving self learning content to teach the world in simple and easy way!!!!!
Hai ví dụ này giải thích khái niệm cuộc gọi chặn và không chặn.
- 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 đó chỉ 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 chờ đọc tệp và tiến hành in “Program Ended” và đồng thời, chương trình không bị chặn tiếp tục đọc tệp.
Do đó, 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 triển khai logic sẽ dễ dàng hơn nhưng các chương trình không chặn không thực hiện 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ý, dữ liệu đó nên được giữ trong cùng một khối để thực hiện tuần tự.