Rate this post

Callback là một hàm tương đương không đồng bộ cho một hàm. Nó được gọi khi hoàn thành mỗi nhiệm vụ. Trong Node.js, các lệnh Callback thường được sử dụng. Tất cả các API của Node đều được viết theo cách để hỗ trợ các lệnh Callback. Ví dụ: khi một hàm bắt đầu đọc tệp, nó sẽ 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.

Trong Node.js, khi quá trình nhập / xuất tệp hoàn tất, nó sẽ gọi hàm Callback. 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ý số lượng yêu cầu cao mà không cần đợi bất kỳ hàm nào trả về kết quả.

Giới thiệu về Callback trong Node.js

Trong Node.js, Callback là một khái niệm quan trọng và phổ biến được sử dụng để xử lý các hoạt động bất đồng bộ (asynchronous operations). Nó cho phép mã JavaScript tiếp tục chạy mà không bị chặn bởi các tác vụ mất thời gian như đọc file, truy vấn cơ sở dữ liệu, hoặc gọi API.

Callback là một hàm được truyền vào như một đối số cho một hàm khác. Khi một hoạt động bất đồng bộ hoàn thành, hàm callback sẽ được gọi lại với kết quả hoặc lỗi tương ứng. Điều này cho phép chương trình tiếp tục thực thi các công việc khác hoặc xử lý kết quả nhận được.

Dưới đây là một ví dụ đơn giản về sử dụng Callback trong Node.js để đọc một tệp văn bản:

const fs = require('fs');

function readFileWithCallback(path, callback) {
  fs.readFile(path, 'utf8', (err, data) => {
    if (err) {
      callback(err, null);
    } else {
      callback(null, data);
    }
  });
}

readFileWithCallback('file.txt', (err, content) => {
  if (err) {
    console.error('Đã xảy ra lỗi:', err);
  } else {
    console.log('Nội dung của tệp:', content);
  }
});

Trong ví dụ trên, chúng ta sử dụng hàm readFile của module fs trong Node.js để đọc tệp file.txt. Khi hoạt động đọc tệp hoàn thành, hàm callback được gọi với hai đối số là err (lỗi, nếu có) và data (nội dung của tệp). Chúng ta kiểm tra lỗi và in ra nội dung hoặc thông báo lỗi tương ứng.

Callback giúp Node.js xử lý các tác vụ bất đồng bộ một cách hiệu quả và tránh tình trạng “chặn” (blocking) của mã JavaScript. Ngoài ra, trong Node.js còn có các phương pháp khác để xử lý bất đồng bộ như Promise và Async/Await, nhưng Callback vẫn là một phần quan trọng trong việc xây dựng ứng dụng Node.js.

Xem thêm Callbacks trong JavaScript

Cách sử dụng Callback trong Node.js

Để sử dụng Callback trong Node.js, bạn có thể tuân theo các bước sau:

  1. Xác định hàm chứa hoạt động bất đồng bộ mà bạn muốn gọi và thực hiện. Hàm này sẽ nhận một tham số callback.
function asyncOperation(callback) {
  // Thực hiện hoạt động bất đồng bộ
  // Gọi callback với kết quả hoặc lỗi tương ứng
}
  1. Trong hàm bất đồng bộ, gọi callback với kết quả hoặc lỗi tương ứng.
function asyncOperation(callback) {
  // Thực hiện hoạt động bất đồng bộ
  if (/* Hoạt động thành công */) {
    callback(null, result); // Gọi callback với kết quả
  } else {
    callback(error, null); // Gọi callback với lỗi
  }
}
  1. Định nghĩa hàm callback để xử lý kết quả hoặc lỗi từ hoạt động bất đồng bộ.
function myCallback(error, result) {
  if (error) {
    // Xử lý lỗi
  } else {
    // Xử lý kết quả
  }
}
  1. Gọi hàm chứa hoạt động bất đồng bộ và truyền callback vào như một đối số.
asyncOperation(myCallback);

Khi hoạt động bất đồng bộ hoàn thành, callback sẽ được gọi và bạn có thể xử lý kết quả hoặc lỗi trong hàm callback. Điều này cho phép mã tiếp tục thực thi mà không bị chặn bởi các hoạt động bất đồng bộ.

Chú ý rằng callback thường có hai đối số: error và result. Nếu không có lỗi xảy ra, error sẽ là null và result chứa kết quả của hoạt động bất đồng bộ. Ngược lại, nếu có lỗi xảy ra, error sẽ chứa thông tin về lỗi và result sẽ là null.

Điều quan trọng khi sử dụng Callback là đảm bảo rằng callback được gọi sau khi hoạt động bất đồng bộ hoàn thành. Bạn cần xử lý lỗi và kết quả trong hàm callback và tiếp tục thực hiện các công việc khác khi cần thiết.

Callback là một phương pháp phổ biến trong Node.js để xử lý các hoạt động bất đồng bộ và đảm bảo rằng mã tiếp tục thực thi một cách hiệu quả mà không bị chặn.

Xem thêm Module DNS Node.js

Xử lý lỗi với Callback trong Node.js

Để xử lý lỗi với Callback trong Node.js, bạn có thể tuân theo các hướng dẫn sau:

  1. Định nghĩa thông báo lỗi trong hàm callback. Thông thường, thông báo lỗi sẽ được truyền như đối số đầu tiên của callback. Bạn có thể sử dụng Error object để tạo thông báo lỗi có chứa thông tin chi tiết về lỗi.
function myCallback(error, result) {
  if (error) {
    console.error('Đã xảy ra lỗi:', error);
    // Xử lý lỗi
  } else {
    // Xử lý kết quả
  }
}
  1. Trong hàm bất đồng bộ, kiểm tra và gọi callback với thông báo lỗi nếu có lỗi xảy ra.
function asyncOperation(callback) {
  // Thực hiện hoạt động bất đồng bộ
  if (/* Hoạt động thành công */) {
    callback(null, result); // Gọi callback với kết quả
  } else {
    const error = new Error('Lỗi xảy ra trong hoạt động bất đồng bộ');
    callback(error, null); // Gọi callback với thông báo lỗi
  }
}
  1. Gọi hàm chứa hoạt động bất đồng bộ và xử lý thông báo lỗi trong hàm callback.
asyncOperation(myCallback);

Khi hoạt động bất đồng bộ gặp lỗi, bạn có thể kiểm tra đối số error trong hàm callback để xác định xem có lỗi xảy ra hay không. Nếu error không null, nghĩa là có lỗi và bạn có thể xử lý lỗi theo ý muốn, ví dụ như in thông báo lỗi hoặc thực hiện các hành động khác tùy thuộc vào loại lỗi.

Ngoài ra, bạn cũng có thể truyền các thông tin liên quan đến lỗi khác như mã lỗi, mô tả lỗi, hoặc stack trace trong Error object. Điều này giúp bạn cung cấp thông tin đầy đủ và hữu ích cho việc xử lý lỗi.

Việc xử lý lỗi trong Callback là quan trọng để đảm bảo ứng dụng của bạn có khả năng xử lý các tình huống không mong muốn và cung cấp thông báo cho người dùng hoặc các thành phần khác trong hệ thống.

Xem thêm array_filter trong php là gì ?

Ví dụ về Callback trong Nodejs

Ví dụ Blocking Code

Làm theo các bước sau:

Tạo một tệp văn bản có tên input.txt có nội dung sau:

Websitehcm là một nền tảng trực tuyến cung cấp các hướng dẫn tự học về  các công nghệ khác nhau, bằng một ngôn ngữ rất đơn giản.    

Tạo một tệp JavaScript có tên main.js có code như sau:

var fs = require("fs");  
var data = fs.readFileSync('input.txt');  
console.log(data.toString());  
console.log("Program Ended");   

Mở dấu nhắc lệnh Node.js và thực thi đoạn mã sau.

Node main.js   

Ví dụ về Non Blocking Code

Làm theo các bước sau:

Tạo một tệp văn bản có tên input.txt có nội dung sau:

Websitehcm là một nền tảng trực tuyến cung cấp các hướng dẫn tự học về  các công nghệ khác nhau, bằng một ngôn ngữ rất đơn giản.     

Tạo một tệp JavaScript có tên main.js có code 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"); 

Mở dấu nhắc lệnh Node.js và thực thi đoạn mã sau.

node main.js   

Bạn có thể thấy rằng hai ví dụ trên 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 mặt khác trong ví dụ thứ hai, chương trình không đợi đọc tệp mà nó chỉ tiến hành in “Chương trình đã kết thúc” và đồng thời chương trình. mà không bị chặn vẫn tiếp tục đọc tệp.

Vì vậy, chúng ta có thể nói rằng, một chương trình chặn thực thi rất nhiều theo trình tự. Việc triển khai logic theo quan điểm lập trình trong các chương trình khối cũng 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ự, vì vậy 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ự.

Xem thêm Bất đồng bộ trong JavaScript là gì ?

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Contact Me on Zalo
Call now