Hàm Callbacks trong JavaScript
Javascript nâng cao | by
Trong JavaScript, callback là một khái niệm quan trọng, giúp lập trình viên kiểm soát luồng thực thi của chương trình, đặc biệt trong các tác vụ bất đồng bộ như xử lý sự kiện, gọi API hoặc đọc dữ liệu từ tệp. Callback là một hàm được truyền vào một hàm khác như một đối số và sẽ được gọi sau khi hàm kia hoàn tất.
Callback đóng vai trò quan trọng trong lập trình JavaScript, giúp mã nguồn linh hoạt hơn và dễ mở rộng. Tuy nhiên, việc sử dụng callback không đúng cách có thể dẫn đến tình trạng Callback Hell, gây khó khăn trong bảo trì mã. Trong bài viết này, chúng ta sẽ tìm hiểu về callback, cách sử dụng, các vấn đề thường gặp và cách khắc phục chúng để viết mã JavaScript hiệu quả hơn.
Hàm Callback là gì?
Trong JavaScript, callback là một hàm được truyền vào một hàm khác dưới dạng đối số và được thực thi sau khi hàm đó hoàn tất nhiệm vụ của mình. Callback giúp lập trình viên kiểm soát luồng thực thi của chương trình, đặc biệt hữu ích trong các tác vụ bất đồng bộ như xử lý sự kiện, đọc dữ liệu từ API hoặc tương tác với cơ sở dữ liệu.
Cách hoạt động của Callback
Khi một hàm nhận một hàm khác làm tham số, nó có thể gọi hàm đó tại một thời điểm nhất định, chẳng hạn như sau khi hoàn tất một công việc nào đó. Điều này giúp JavaScript có thể thực hiện các tác vụ bất đồng bộ mà không làm gián đoạn chương trình.
Ví dụ minh họa về Callback
Ví dụ đơn giản về callback:
function greet(name, callback) { console.log("Xin chào, " + name + "!"); callback(); } function sayGoodbye() { console.log("Hẹn gặp lại!"); } // Gọi hàm greet và truyền sayGoodbye làm callback greet("Nguyễn", sayGoodbye);
Kết quả in ra:
Xin chào, Nguyễn! Hẹn gặp lại!
Trong ví dụ trên, hàm sayGoodbye
được truyền vào greet
và được thực thi sau khi câu "Xin chào" được in ra.
Cách sử dụng Callback trong JavaScript
Truyền một hàm như một tham số cho một hàm khác
JavaScript cho phép truyền một hàm như một tham số vào một hàm khác, sau đó gọi lại hàm đó trong quá trình thực thi. Điều này giúp linh hoạt trong việc xử lý logic chương trình.
Ví dụ:
function processData(data, callback) { console.log("Đang xử lý dữ liệu: " + data); callback(); } function onComplete() { console.log("Xử lý dữ liệu hoàn tất!"); } // Gọi hàm processData và truyền onComplete làm callback processData("Thông tin khách hàng", onComplete);
Kết quả in ra:
Đang xử lý dữ liệu: Thông tin khách hàng Xử lý dữ liệu hoàn tất!
Viết và gọi một hàm Callback
Ngoài cách truyền một hàm đã định nghĩa sẵn, bạn cũng có thể truyền trực tiếp một hàm ẩn danh (anonymous function) hoặc một hàm mũi tên (arrow function) làm callback.
Ví dụ với hàm ẩn danh:
function downloadFile(url, callback) { console.log("Đang tải file từ: " + url); setTimeout(function() { console.log("Tải file hoàn tất!"); callback(); }, 2000); } // Gọi hàm với một hàm ẩn danh làm callback downloadFile("https://example.com/file", function() { console.log("Bắt đầu xử lý file..."); });
Kết quả in ra sau 2 giây:
Đang tải file từ: https://example.com/file Tải file hoàn tất! Bắt đầu xử lý file...
Ví dụ với arrow function:
downloadFile("https://example.com/file", () => { console.log("Bắt đầu xử lý file..."); });