30/09/2018, 18:38

JavaScript - Debounce function là gì?

Lúc trước mình có làm một bài test yêu cầu làm một Instant Search như của Twitter. Trong quá trình làm, sẽ phát sinh một trường hợp như trong hình dưới đây.

http://vhnam.github.io/blog/javascript-debounce-function-la-gi/images/example.png

Tức là, mình gởi 3 request, thì sẽ có 3 response tương ứng. Nhưng mình chỉ muốn gởi request thứ 3 với từ khóa “abc” nhưng response trả về lại là dữ liệu của từ khóa “ab”. Như vậy kết quả search của người dùng sẽ bị sai, ảnh hưởng nghiêm trọng tới UX.

Mình được giới thiệu kỹ thuật Debounce để giải quyết vấn đề này, sẵn tiện viết thành blog để chia sẻ luôn

Mình có viết chưa đúng chỗ nào, mong mọi người chỉ chỗ để sửa.

http://vhnam.github.io/blog/javascript-debounce-function-la-gi/

Mai Anh Dũng viết 20:51 ngày 30/09/2018

Trình bày khó hiểu hơn bài throttle


Không gửi Pull request được nhỉ, Đạt đọc tới đoạn này thấy cái indentation bị lỗi, ngứa tay sửa lại.

https://gist.github.com/trandatnh/7f04e13d1cfe33a039ca#file-debounce-step-3-js

Còn mấy chỗ bị lỗi indent nữa đó

Võ Hoài Nam viết 20:46 ngày 30/09/2018

Cái Gist nó bị lỗi indent liên tục nên em lười sửa nữa

Em sẽ rút kinh nghiệm, mai mốt viết kiểu bottom-up (cách sử dung rồi mới tới cách implement). Thực ra, debounce anh tưởng tượng là thế này. Mỗi lần gởi request là anh có 500ms để delay. Nếu trong thời gian delay của request thứ nhất, có một request thứ hai gởi tiếp thì sẽ ignore request thứ hai.

Để em cập nhật lại một phiên bản khác cho dễ hiểu hơn

Mai Anh Dũng viết 20:43 ngày 30/09/2018

À, anh hiểu cái debounce, nhưng mà cách trình bày của bài này không rõ bằng bài throttle.


Ủa hình như anh hiểu nhầm?

Nếu trong thời gian delay của request thứ nhất, có một request thứ hai gởi tiếp thì sẽ ignore request thứ hai.

Anh hiểu là nó ignore request thứ nhất chứ nhỉ?

Trong đoạn code này thì mình clearTimeout(timeout) cho cái request trước rồi set lại timeout cho request mới.


function debounce(func, wait) {
  var timeout;

  return function() {
    var context = this,
        args = arguments;

    var executeFunction = function() {
      func.apply(context, args);
    };

    clearTimeout(timeout);
    timeout = setTimeout(executeFunction, wait);
  };
};
Võ Hoài Nam viết 20:45 ngày 30/09/2018

à, em viết sai… ignore cái request thứ nhất đó anh

Võ Hoài Nam viết 20:48 ngày 30/09/2018

Chào mọi người, mình mới cập nhật thêm demo để mọi người dễ hình dung hơn.

// anh @ltd thấy demo thế nào?

Mai Anh Dũng viết 20:46 ngày 30/09/2018

Chà công phu quá. Em làm thế này thì mai mốt cáoi blog thành cái CV online rồi

Bài liên quan
0