Es gibt einen wirklich guten Ansatz auf unscriptable.com:
Function.prototype.debounce = function (threshold, execAsap) {
var func = this, // Verweis auf die originale Funktion
timeout; // Handle zum setTimeout-Async-Task (Detektionszeitraum)
// Gib die neue gedeublockte Funktion zurück, die die originale Funktion nur einmal ausführt, bis der Detektionszeitraum abgelaufen ist
return function debounced () {
var obj = this, // Verweis auf das originale Kontextobjekt
args = arguments; // Argumente zur Ausführungszeit
// Dies ist die Detektionsfunktion. Sie wird ausgeführt, wenn der Zeitraum abläuft
function delayed () {
// Wenn wir am Ende des Detektionszeitraums sind
if (!execAsap)
func.apply(obj, args); // jetzt ausführen
// Timeout-Handle löschen
timeout = null;
};
// Aktuellen Detektionszeitraum stoppen
if (timeout)
clearTimeout(timeout);
// Andernfalls, wenn wir nicht bereits warten und am Anfang des Wartezeitraums ausführen
else if (execAsap)
func.apply(obj, args); // jetzt ausführen
// Wartezeitraum zurücksetzen
timeout = setTimeout(delayed, threshold || 100);
};
}
Dies würde es Ihnen ermöglichen:
// Funktion 200ms nach dem letzten Auslösen des bounds_changed-Ereignisses aufrufen:
google.maps.event.addListener(map, 'bounds_changed', (function() {
// hier kommt ein Ajax-Aufruf
}).debounce(200));
// Funktion nur einmal alle 200ms aufrufen:
google.maps.event.addListener(map, 'bounds_changed', (function() {
// hier kommt ein Ajax-Aufruf
}).debounce(200,true));
Wenn Sie es bevorzugen, das Function.prototype
nicht zu erweitern, gibt es eine eigenständige function debounce(func, threshold, execAsap)
auf dem Blog-Beitrag verfügbar.