GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing completejavascript.com — Callback là gì? Callback trong JavaScript Cập nhật ngày 08/05/2022 Trong bài viết trước, mình đã giới thiệu cơ bản về xử lý bất đồng bộ trong JavaScript. Bài viết này mình sẽ giới thiệu chi tiết hơn về callback trong JavaScript. Thực tế, JavaScript có nhiều hàm cho phép bạn xử lý không đồng bộ. Nói cách khác, các hành động được bắt đầu ngay bây giờ, nhưng chúng sẽ kết thúc sau đó. Ví dụ một trong những hàm như vậy là Ngoài ra, có những ví dụ thực tế khác về các hành động bất đồng bộ, như việc tải các tập lệnh và module. Hãy xem hàm Đoạn code trên chèn vào Bạn có thể dùng hàm trên như sau: Tập lệnh tải về được thực thi bất đồng bộ, vì nó bắt đầu tải về ngay khi gọi hàm, nhưng chạy sau khi tải về kết thúc. Nếu có bất kỳ câu lệnh nào bên dưới Giả sử, mình cần sử dụng tập lệnh mới ngay khi tải xong. Tập lệnh đó khai báo các chức năng mới và mình muốn chạy chúng (ví dụ các thư viện JavaScript). Nhưng nếu mình làm điều đó ngay sau lời gọi hàm Bởi vì, việc tải về Vấn đề đặt ra là: mình cần biết khi nào tập lệnh được tải xong để sử dụng các hàm và biến mới từ tập lệnh đó. Để giải quyết vấn đề này, bạn có thể sử dụng hàm callback. Callback là gì?Hãy thêm một hàm Bây giờ, nếu bạn muốn gọi các hàm mới từ script thì nên viết chúng bên trong Ý tưởng của callback trong JavaScript: sử dụng đối số thứ hai là một hàm (thường là hàm ẩn danh) để chạy khi hành động được hoàn thành. Sau đây là một ví dụ thực tế với script là thư viện lodash: Cách làm trên được gọi là: kiểu lập trình không đồng bộ dựa trên callback. Tức là một hàm thực hiện điều gì đó bất đồng bộ sẽ cung cấp một đối số Ở đây, mình ví dụ với việc Callback trong callbackLàm cách nào để tải tuần tự hai Giải pháp bình thường sẽ là đặt lời gọi hàm Sau khi lần gọi Nhưng vấn đề đặt ra nếu bạn phải tải về nhiều tập lệnh hơn thì sao? Như vậy, mọi hành động mới đều nằm trong callback của hành động trước. Điều đó là OK trong trường hợp có một vài hành động, nhưng sẽ là không OK khi có nhiều hành động. Đó là lý do mà JavaScript có các biến thể khác để xử lý bất đồng bộ như Promise hay Async/await mà mình sẽ giới thiệu kỹ hơn trong các bài viết sau. Xử lý lỗi trong callbackTrong các ví dụ trên, mình không quan tâm đến trường hợp lỗi. Nhưng điều gì sẽ xảy ra nếu quá trình tải tập lệnh không thành công? Callback cần phải xử lý được vấn đề đó. Sau đây là một phiên bản cải tiến của hàm Bây giờ hàm Cách sử dụng: Ở đây, cách thức mà mình sử dụng Quy ước là:
Vì vậy, hàm Vấn đề callback hellThoạt nhìn, cách làm trên có vẻ khả thi đối với việc lập trình không đồng bộ. Và thực sự là như vậy. Đối với một hoặc có thể hai lời gọi hàm lồng nhau, cách làm trên vẫn tốt. Nhưng với nhiều hành động không đồng bộ nối tiếp nhau, mình sẽ có đoạn code dạng như sau: Trong đoạn code trên:
Khi các lời gọi hàm trở nên lồng nhau nhiều hơn, cấu trúc code trở nên sâu hơn và ngày càng khó quản lý hơn. Đặc biệt, nếu bạn có đoạn code thực tế thay vì mã Đó chính là callback hell - làm cho đoạn code trở nên xấu và cực kỳ khó quản lý. Vì vậy, cách viết code như này là không thực sự tốt. Để khắc phục vấn đề trên, mình có thể tách logic trên thành các hàm độc lập như sau: Với cách làm trên, rõ ràng kết quả thu được hoàn toàn tương tự nhưng không còn cấu trúc code lồng nhau thành nhiều tầng như trước. Tuy nhiên, có một vấn đề khác phát sinh. Đó là logic code bị xé nhỏ. Nghĩa là bạn phải di chuyển lên xuống nhiều để theo dõi và hiểu hết toàn bộ logic code. Ngoài ra, các hàm Tổng kếtCallback trong JavaScript cũng khá tốt khi xử lý bất đồng bộ, nhưng chỉ nên sử dụng khi có một hoặc hai hành động bất đồng bộ lồng nhau. Trường hợp có nhiều hành động bất đồng bộ hơn thì bạn nên sử dụng các cách khác tốt hơn. Đó chính là: Promise hoặc Async/await. Tham khảo: Introduction: callbacks ★ Nếu bạn thấy bài viết này hay thì hãy theo dõi mình trên Facebook để nhận được thông báo khi có bài viết mới nhất nhé:
Chia sẻ: Bình luận |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |