Вопрос по javascript – underscore.js: _.throttle (функция, ожидание)

11

Согласноunderscore документация:

throttle_.throttle (функция, подожди)
Создает и возвращает новую, ограниченную версию переданной функции, которая при многократном вызове будет фактически вызывать исходную функцию не чаще одного раза за каждые миллисекунды ожидания. Полезно для ограничивающих скорость событий, которые происходят быстрее, чем вы успеваете.

Что это значитUseful for rate-limiting events that occur faster than you can keep up with.
Эта функция эквивалентна setTimeout с функцией, которая вызывает себя сама?
Кто-нибудь может привести пример jsfiddle?

Это полезно, например для прокрутки или изменения размера обработчиков событий, которые в большинстве случаев часто используются при прокрутке или изменении размера окн Niko

Ваш Ответ

5   ответов
9

это не просто setTimeout () Попробуйте это

var a = _.throttle(function(){console.log('called')}, 1000);
while(true) {
  a();
}

it будет вызываться один раз в секунду, а не один раз в каждой итерации. В нативном JS это будет выглядеть та

var i = null;
function throttle(func, delay){
  if (i) {
      window.clearTimeout(i);
  }
  i = window.setTimeout(func, delay)
}

не совсем то же самое, но только для иллюстрации того, что функция вызывается один раз

Ты не должен использоватьwhile(true) andlrc
Этоdebounce, неthrottle, поскольку он никогда не сработает, пока он вызывается до сброса таймера. vsync
4

Ответ Дархазера

Это больше похоже на то, что _.throttle вызывается неизбежно, а затем снова послеdelay миллисекунды

function throttle(func, delay) {
    var timer = 0;

    return function() {
        var context = this,
            args = [].slice.call(arguments);

        clearTimeout(timer);
        timer = setTimeout(function() {
            func.apply(context, args);
        }, delay);
    };
}
Это тожеdebounce функция ... неthrottle один. Drupalmotion.com / статьи / ... vsync
1

http: //jsfiddle.net/amyseqmedia/dD99u/37

В моем случае мне нужен был дроссель, потому что функция (которая была запросом к серверу) вызывалась около 500 раз за 1 секунду и перегружала сервер. Поэтому я изменил его так, чтобы функция могла вызываться только maxодин ра за 3 секунды. Поэтому не имеет значения, сколько раз он вызывается, это будет происходить только раз в 3 секунды.

Что-то вроде этого

var informationFromServer;
var a = _.throttle(function(){
    informationFromServer = serverCallFunction();
}, 3000);

function getsCalledALot()
{
    a();
}

function serverCallFunction()
{
    var data = $.post....
    return data;
}
согласовано, Jsfiddle.net / amyseqmedia / dD99u / 37 отлично! jbobbins
скрипка больше не работает. Flame_Phoenix
0

_. Придушить используется для предотвращения частых вызовов метода для определенного изображения ms.Refer, чтобы понять это RestrictfrequentCall.jpg

1

Разница между дроссельной заслонкой и тягой описана здесь:https: //css-tricks.com/the-difference-between-throttling-and-debouncing

/*
"Debouncing enforces that a function not be called again until a certain amount of time has passed without it being called. As in "execute this function only if 100 milliseconds have passed without it being called."
"Perhaps a function is called 1,000 times in a quick burst, dispersed over 3 seconds, then stops being called. If you have debounced it at 100 milliseconds, the function will only fire once, at 3.1 seconds, once the burst is over. Each time the function is called during the burst it resets the debouncing timer."
*/
_.debounce = (fn, delay) => {
  let timer
  return (...args) => {
    if (timer) clearTimeout(timer)
    timer = setTimeout(() => {
      fn.apply(null, args)
    }, delay)
  }
}
/*
"Throttling enforces a maximum number of times a function can be called over time. As in "execute this function at most once every 100 milliseconds."
 */
_.throttle = (fn, delay) => {
  let canCall = true
  return (...args) => {
    if (canCall) {
      fn.apply(null, args)
      canCall = false
      setTimeout(() => {
        canCall = true
      }, delay)
    }
  }
}

Похожие вопросы