Tips

Gõ 5 phím, server chỉ nhận 1 request: debounce 300ms hoạt động thế nào?

Tóm tắt

Debounce hoãn lời gọi hàm cho tới khi có một khoảng “im lặng” đủ dài. Mỗi phím gõ huỷ hẹn giờ cũ và đặt lại từ đầu, nên gõ “redis” chỉ tạo đúng 1 request thay vì 5.

Không debounce vs. có debounce

Không debounceDebounce 300ms
Gõ “redis”5 request: r, re, red, redi, redis1 request: redis
Ngập ngừng 220ms sau “red”Vẫn bắn requestChưa đủ 300ms → bị huỷ khi gõ “i”
Tải serverXử lý cả truy vấn dở dangChỉ xử lý truy vấn cuối

Cài đặt tối giản

function debounce(fn, ms = 300) {
  let t;
  return (...args) => {
    clearTimeout(t);
    t = setTimeout(() => fn(...args), ms);
  };
}
input.addEventListener('input', debounce(e => search(e.target.value)));

Áp dụng thế nào?

  • Dùng debounce cho: ô tìm kiếm, autosave, validate khi gõ, sự kiện resize.
  • Dùng throttle thay vì debounce khi cần cập nhật đều đặn trong lúc người dùng còn thao tác (scroll, kéo thả).
  • Kết hợp huỷ request cũ bằng AbortController để response về muộn không ghi đè kết quả mới.