Node.js - Callbacks Concept

What is Callback?

Một Callback trong Node.js là tương đương bất đồng bộ với một hàm. Đây là một loại hàm đặc biệt được truyền dưới dạng đối số cho một hàm khác. Node.js sử dụng nhiều callback. Callbacks giúp chúng ta thực hiện các cuộc gọi bất đồng bộ. Tất cả các API của Node đều được viết theo cách hỗ trợ callback.

Các hướng dẫn lập trình được thực thi đồng bộ theo mặc định. Nếu một trong những hướng dẫn trong chương trình dự kiến thực hiện một quá trình kéo dài, luồng chính của quá trình thực thi sẽ bị chặn. Các hướng dẫn tiếp theo chỉ có thể được thực thi sau khi quá trình I/O hiện tại hoàn tất. Đây là lúc các hàm gọi lại (callbacks) xuất hiện.

Hàm callback được gọi khi hàm chứa callback như một tham số hoàn thành việc thực thi của nó, và cho phép mã trong callback chạy trong thời gian đó. Đ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 chờ bất kỳ hàm nào trả về kết quả.

Cú pháp để triển khai callback trong Node.js như sau −

function function_name(argument, function (callback_argument){
   // callback body 
})

Hàm setTimeout() trong Node.js là một ví dụ điển hình về callback. Đoạn mã sau gọi phương thức setTimeout() không đồng bộ, chờ đợi 1000 mili giây, nhưng không chặn luồng. Thay vào đó, thông điệp "Hello World" sẽ được hiển thị trước, sau đó là thông điệp theo thời gian đã định.

Example

setTimeout(function () { 
   console.log('This prints after 1000 ms'); 
}, 1000);

console.log("Hello World");

Output

Hello World
This prints after 1000 ms

Blocking Code Example

Để hiểu về tính năng callback, hãy lưu đoạn văn bản sau dưới dạng tệp input.txt.

TutorialsPoint is the largest free online tutorials Library
Master any technology.
From programming languages and web development to data science and cybersecurity

Đoạn mã sau đọc tệp một cách đồng bộ với sự trợ giúp của hàm readFileSync() trong mô-đun fs. Vì thao tác này là đồng bộ, nó sẽ chặn việc thực thi phần còn lại của mã.

var fs = require("fs");
var data = fs.readFileSync('input.txt');

console.log(data.toString());

let i = 1;
while (i <=5) {
  console.log("The number is " + i);
  i++;
}

Đầu ra cho thấy Node.js đọc tệp, hiển thị nội dung của nó. Chỉ sau đó, vòng lặp sau đây in các số từ 1 đến 5 được thực thi.

TutorialsPoint is the largest free online tutorials Library
Master any technology.
From programming languages and web development to data science and cybersecurity

The number is 1
The number is 2
The number is 3
The number is 4
The number is 5

Non-Blocking Code Example

Chúng tôi sử dụng cùng một tệp input.txt trong đoạn mã sau để minh họa việc sử dụng callback.

TutorialsPoint is the largest free online tutorials Library
Master any technology.
From programming languages and web development to data science and cybersecurity

Hàm ReadFile() trong mô-đun fs được cung cấp một hàm callback. Hai đối số được truyền cho hàm callback là lỗi và giá trị trả về của chính hàm ReadFile(). Hàm callback được gọi khi ReadFile() hoàn thành bằng cách trả về lỗi hoặc nội dung tệp. Trong khi thao tác đọc tệp đang diễn ra, Node.js sẽ thực thi vòng lặp tiếp theo một cách bất đồng bộ.

var fs = require("fs");
fs.readFile('input.txt', function (err, data) {
   if (err) return console.error(err);
   console.log(data.toString());
});

let i = 1;
while (i <=5) {
  console.log("The number is " + i);
  i++;
}

Output

The number is 1
The number is 2
The number is 3
The number is 4
The number is 5
TutorialsPoint is the largest free online tutorials Library
Master any technology.
From programming languages and web development to data science and cybersecurity

Callback as Arrow function

Bạn cũng có thể gán một hàm mũi tên (arrow function) làm đối số callback. Hàm mũi tên trong JavaScript là một hàm vô danh. Nó cũng được gọi là hàm lambda. Cú pháp sử dụng hàm mũi tên làm callback trong Node.js như sau −

function function_name(argument, (callback_argument) => { 
   // callback body 
})

Nó được giới thiệu trong phiên bản ES6 của JavaScript. Hãy thay thế callback trong ví dụ trên bằng một hàm mũi tên.

var fs = require("fs");

fs.readFile('input.txt',  (err, data) => {
   if (err) return console.error(err);
   console.log(data.toString());
});

let i = 1;
while (i <=5) {
  console.log("The number is " + i);
  i++;
}

Mã trên tạo ra đầu ra tương tự như ví dụ trước.