13

アンダースコアのドキュメントによると:

throttle_.throttle(function、wait)
渡された関数の新しいスロットルバージョンを作成して返します。これを繰り返し呼び出すと、実際には待機ミリ秒ごとに最大1回だけ元の関数が呼び出されます。あなたが追いつくことができるより速く発生するレート制限イベントに役立ちます。

それはどういう意味ですかUseful for rate-limiting events that occur faster than you can keep up with
この関数は、それ自体を呼び出す関数を持つsetTimeoutと同等ですか?
誰かがjsfiddleの例を教えてもらえますか?

4

5 に答える 5

9

setTimeout() だけではありませんこれを試してください

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

反復ごとに 1 回ではなく、1 秒ごとに 1 回呼び出されます。ネイティブ JS では、次のようになります。

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

まったく同じではありませんが、関数が 1 回呼び出されることを示すためだけに

于 2012-05-01T08:32:40.297 に答える
4

Darhazerの答えを拡張するには

_.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);
    };
}
于 2013-01-14T06:34:51.893 に答える
2

私を助けてくれたこの優れたjsfiddleを見つけました:

jsfiddle.net/max23_/2wn5ybdg/1 (@max23_ によって更新)

私の場合、関数 (サーバー要求) が 1 秒間に約 500 回呼び出され、サーバーに過負荷がかかっていたため、スロットルが必要でした。そのため、関数を最大3 秒に 1しか呼び出せないように変更しました。したがって、何回呼び出されても問題ありません。最大 3 秒に 1 回しか発生しません。

このようなもの:

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

function getsCalledALot()
{
    a();
}

function serverCallFunction()
{
    var data = $.post....
    return data;
}
于 2014-10-08T23:02:35.023 に答える