Untitled

mail@pastecode.io avatar
unknown
javascript
2 years ago
1.2 kB
3
Indexable
Never
const someCalc = function(a) {
  console.log(a + this.b)
};

function throttle(callback, wait, context = this) {
  // Ваш код здесь
  let nextCall = undefined;
  let madeFirstCall = false;
  let intervalId;
  const f = function (...args) {
    if (!madeFirstCall) {
      madeFirstCall = true;
      callback.bind(this)(args);
    } else {
      nextCall = [callback, [...args]];
    }
    intervalId = setTimeout( () => {
      if (nextCall !== undefined) {
        nextCall[0].bind(this)(nextCall[1]);
        nextCall = undefined;
      }
      madeFirstCall = false;
      clearTimeout(intervalId);
    }, wait);
  };
  return f.bind(context);
}

// затормозить функцию до одного раза в 1000 мс
const f1000 = throttle(someCalc, 1000, {b: ' call'});
f1000(1); // выведет 1 call
f1000(2); // (тормозим, не прошло 1000 мс)
f1000(3); // (тормозим, не прошло 1000 мс)
setTimeout(() => {
  f1000(30); // (тормозим, не прошло 1000 мс)
}, 2000);

// когда пройдёт 1000 мс...
// выведет 3 call, промежуточное значение 2 call игнорируется