Hay varios divs y controladores para enviar solicitudes ajax cuando se hace clic en ellos. Mi problema es que no sé cómo obligar a mi controlador a no exceder el límite de 1 solicitud por 30 segundos.
¡Aprecio tu ayuda!
El excelente Underscore.js tiene una función de aceleración. Pasa el controlador que desea acelerar y obtiene una versión de velocidad limitada de la misma función.
var throttled = _.throttle(someHandler, 100); $(div).click(throttled);http://documentcloud.github.com/underscore/#throttle
Aquí hay una versión simplificada que he usado en mi propio código:
function throttle(func, wait) { var timeout; return function() { var context = this, args = arguments; if (!timeout) { // the first time the event fires, we setup a timer, which // is used as a guard to block subsequent calls; once the // timer's handler fires, we reset it and create a new one timeout = setTimeout(function() { timeout = null; func.apply(context, args); }, wait); } } }Una buena manera de probarlo es activando un montón de eventos de desplazamiento y observando el registro de su controlador en la consola de Firebug:
document.addEventListener("scroll", throttle(function() { console.log("test"); }, 2000), false); Aquí hay una versión que limita los eventos de clic en div s a una vez cada 30 segundos, según lo solicitado (requiere jQuery):
$("div").click(throttle(function() { // ajax here }, 30000));Si desea limitar la tasa, desafortunadamente el método _.throttle que proporciona underscore.js no es su solución. Throttle simplemente se asegurará de que su método nunca se llame más de X segundos y, por lo tanto, todas las llamadas de función posteriores se descartarán hasta que haya pasado ese período.
Si desea establecer un límite de velocidad para que nunca llame a su función más de X veces por segundo, pero no pierda esas llamadas de función por completo, entonces necesita una solución completamente diferente.
He escrito una extensión de guión bajo en https://gist.github.com/1084831
Puede ver un ejemplo práctico en http://jsbin.com/upadif/8/edit#preview
Cree un indicador booleano canFireRequest, o lo que sea, y configúrelo en falso después de cada solicitud ajax. A continuación, cree un lapso de tiempo de 30 segundos que lo restablezca como verdadero; verifique el valor de la bandera antes de cada nueva solicitud.
He aquí un ejemplo aproximado:
if ($(this).data('canFireRequest')) { // Ajax request goes here $(this).data('canFireRequest', false); } setTimeout(function() { $(this).data('canFireRequest', true) }, 30000);