スロットル機能は、呼び出し元の関数の高い周波数を最適化する別の一般的な手段であり、コアの機能は、高周波用に最適化され、時間-周波数において実行されるコール
絞りと防振機能差の関数ということです。
防振機能は、連続する2における複数の呼び出しの前と後に検出時間間隔に合わせた間隔内の関数呼び出しです。
スロットル機能は、頻繁にコールする特定の時間間隔に応じて、関数呼び出しとして弱められます。
具体的な実装では、2つのタイプ、すなわち、タイムスタンプと達成するために実装され、タイマーに分けることができます
タイマー実現
場合は、関数呼び出し、タイマーの完了を待つ、またはに対処するための新しいタイマーを作成することがあれば、タイマーがあるかどうかをまずチェック。
この考え方によると、実質的に以下のコードを得ることが可能です。
function throttleByTimer(cb, wait) {
let timer = null;
return function() {
if(timer) return;
timer = setTimeout(() => {
cb.apply(this, arguments);
timer = null;
}, wait);
}
}
タイムスタンプ達成
関数が呼び出されると、現在のタイムスタンプと最後の実行とタイムスタンプが比較、待機時間間隔を完了し、関数呼び出しが、回を無視してそれ以外の場合は、コールバックとタイムスタンプを記録しています。
function throttleByTimeStamp(cb, wait) {
let preTimeStamp = +new Date();
return function() {
let nowTimeStamp = +new Date();
if (nowTimeStamp - preTimeStamp < wait) return;
cb.apply(this, arguments);
preTimeStamp = nowTimeStamp;
}
}
最初のタイマーを達成するために見つけることができる2つの方法の比較がすぐに実行することができない、とあなたはすぐに最初の実行のタイムスタンプを実現することができますが、確かに最後のコールバックの実装を保証しませ。実際のビジネスの発展は、結果の精度を確保するために、多くの場合、最後のコールバックの実行を確認する必要があります。
したがって、最終的なバージョンは、次の、最適化することができます
function throttle(cb, wait) {
let preTimeStamp = 0;
let timer = null;
return function() {
let nowTimeStamp = +new Date();
let difTimeStamp = nowTimeStamp - preTimeStamp;
if (difTimeStamp < wait) {
if (timer) return;
timer = setTimeout(() => {
cb.apply(this, arguments);
timer = null;
preTimeStamp = +new Date();
}, wait - difTimeStamp);
return;
}
clearTimeout(timer);
timer = null;
cb.apply(this, arguments);
preTimeStamp = nowTimeStamp;
}
}
使用します。
timerPDom.onmousemove = throttle(move, 1000);
シナリオ
イベントのMouseMove、スクロールやリスニングの他の頻繁なトリガー
ローリングロード
頻繁な呼び出しなどその他の機能
概要
最適化機能が絞られ、絶えず水プロセスの低下にタップからすべての時間間隔を垂れ、水がない排水を収集することが可能であるに例えるすることができます
タイマーの特性によるタイマーのスロットルは、最初の時間はすぐに実行することはできませんが、確かに最後の履行を確保します
初めてのタイムスタンプスロットリングは、即座に実行することができますが、最後の実施を確保することができません
どちらの方法は、実用的なアプリケーションは、と統合する必要があり、独自の欠陥単一の実装を持っている
公共の番号からの記事:ルイ江クラウドコンピューティング
ルイ江Yunguanのウェブサイトへのリンク:https://www.eflycloud.com/home?from=RJ0024