🚀 Refactor Javascript - removeEventListener gọn gàng bằng AbortController

0 0 0

Người đăng: Phạm Đình Thiện

Theo Viblo Asia

Trong bài viết này mình sẽ chia sẻ với anh em một trick rất hay để refactor code khi removeEventListener, bằng cách sử dụng AbortController.

Bài viết này đúc kết từ video trên kênh YouTube của Thiện

Vấn đề thực tế

Trong các dự án thực tế, khi anh em addEventListener, chắc chắn anh em sẽ phải removeEventListener khi không sử dụng để tránh tình trạng Memory Leak.

Ví dụ:

// Có 2 hàm xử lý sự kiện
function handleClick_1() { console.log('click 1');
} function handleClick_2() { console.log('click 2');
} // Add event listener
document.addEventListener('click', handleClick_1);
document.addEventListener('click', handleClick_2); // Remove event listener
function clearEventListener() { document.removeEventListener('click', handleClick_1); document.removeEventListener('click', handleClick_2);
}

Tuy nhiên, vấn đề bắt đầu nảy sinh, khi anh em cần thêm bất cứ sự kiện nào (mouseup, mousedown, click, ...) thì anh em sẽ phải thêm removeEventListener tương ứng.

Ví dụ khi thêm mới sự kiện click, anh em sẽ cần removeEventListener khi không còn sử dụng:

function handleClick_3() { console.log('click 3');
} document.addEventListener('click', handleClick_3); // Phải thêm remove
function clearEventListener() { document.removeEventListener('click', handleClick_1); document.removeEventListener('click', handleClick_2); document.removeEventListener('click', handleClick_3); // Thêm dòng này
}

Anh em sẽ thấy nó hơi dài dòng. Vì khi thêm 5, 10 sự kiện nữa, anh em bắt buộc phải thêm 5, 10 hàm removeEventListener tương ứng.

Vậy có cách nào để refactor không?

Giải pháp: Sử dụng AbortController

Thông thường anh em hay sử dụng AbortController để hủy bỏ việc nhận response API từ server trả về. Nhưng ngoài công dụng trên, nó còn giúp anh em hủy bỏ các event listener.

Cách thực hiện

Bước 1: Tạo controller và signal

// Tạo AbortController
const controller = new AbortController(); // Tạo signal từ controller
const signal = controller.signal;

Bước 2: addEventListener với signal

function handleClick_1() { console.log('click 1');
} function handleClick_2() { console.log('click 2');
} // Điểm khác biệt: thêm tham số thứ 3
document.addEventListener('click', handleClick_1, { signal: signal
}); document.addEventListener('click', handleClick_2, { signal: signal
});

Điểm khác biệt quan trọng: Chúng ta thêm một tham số thứ 3 trong hàm addEventListener. Đây là một object với key signal và value tương ứng.

Bước 3: Clear tất cả event listener chỉ với 1 dòng code

function clearEventListener() { controller.abort(); // Chỉ cần 1 dòng này thôi!
}

Lợi ích khi thêm mới sự kiện

Khi anh em thêm addEventListener, anh em sẽ không cần phải bổ sung thêm bất cứ removeEventListener nào:

function handleClick_3() { console.log('click 3');
} // Chỉ cần addEventListener với signal
document.addEventListener('click', handleClick_3, { signal: signal
}); // KHÔNG cần thêm gì vào hàm clearEventListener
// Vì controller.abort() đã tự động clear tất cả!

Kết

Anh em nên sử dụng AbortController khi có nhiều event listener cần quản lý và muốn code clean, dễ maintain.

Lưu ý:

  • AbortController hoạt động với các browser hiện đại (tại đây).
  • Nên tạo controller riêng cho từng component/module.

1 phút Quảng cáo

Nếu anh em muốn có thêm nhiều kiến thức thú vị về tối ưu Frontend, anh em có thể đăng ký khoá học “Optimize Frontend for Beginner” của mình trên Udemy nhé. Hiện tại khoá học đang được ưu đãi nên anh em nhanh tay đăng ký ngay nha vì số lượng có hạn.

Link đăng ký khoá học tại đây nhé anh em:

https://www.udemy.com/course/optimize-frontend-for-beginner/?referralCode=96B9E7A8858C7A0CFE48

Đây là những gì anh em sẽ nắm được trong khoá học: image.png


Anh em hãy kết nối với mình qua Youtube và LinkedIn để đọc nhiều bài viết hay khác nhé:

  1. Youtube: https://www.youtube.com/@pdthien
  2. LinkedIn: www.linkedin.com/in/pdthien

Bình luận

Bài viết tương tự

- vừa được xem lúc

Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 30)

. Hello xin chào mọi người, mình đã trở lại và tiếp tục với phần 30 của series về Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết. Bắt đầu thôi nào.

0 0 56

- vừa được xem lúc

5 câu hỏi phỏng vấn Frontend giúp bạn tự tin hơn khi sử dụng bất đồng bộ trong Javascript

Một trong những điều khó khăn khi học Javascript là promises. Chúng không dễ hiểu và có thể cần một vài hướng dẫn và một thời gian kha khá để vận dụng chúng.

0 0 117

- vừa được xem lúc

Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết (Phần 31)

Hello xin chào mọi người, mình đã trở lại và tiếp tục với phần 31 của series về Một vài thủ thuật CSS mà chính Frontend có thể còn chưa biết. Bắt đầu thôi nào.

0 0 55

- vừa được xem lúc

Những lý do khiến mình thích CSS custom properties hơn SASS variables?

Halo các bạn,. Lại là mình với một bài post liên quan tới chủ đề Front-end đây Mình còn nhớ hồi mình bắt đầu tìm hiểu và bị SASS lôi cuốn, mình đã nghĩ rằng mình sẽ chẳng bao giờ cần dùng đụng tới CSS

0 0 98

- vừa được xem lúc

Usability là gì? Những lưu ý khi thiết kế Usability

Usability là một yếu tố quan trọng trong sự thành bại của sản phẩm. Thật đáng tiếc khi sản phẩm làm ra ưu việt về tính năng, nhưng lại không được người dùng tiếp nhận, đơn giản chỉ vì khó sử dụng.

0 0 47

- vừa được xem lúc

7 Repos cho Front-End mà chính bạn còn không biết là bạn cần nó

. Những repos chẳng mấy khi được nhắc đến nhưng lại giúp bạn build mọi thứ nhanh hơn và tốt hơn nhiều. Chúng ta đang sống trong một thời đại có sẵn các công cụ và tài nguyên hoàn hảo, chúng chỉ cách t

0 0 47