Diferencia entre limitar y eliminar el rebote de una función

Resuelto bhavya_w asked hace 9 años • 0 respuestas

¿Alguien puede darme una explicación en palabras simples sobre la diferencia entre limitar y eliminar el rebote de una función con fines de limitación de velocidad?

Para mí, ambos parecen hacer lo mismo. Revisé estos dos blogs para averiguarlo, pero todavía tengo problemas para entenderlo.

http://remysharp.com/2010/07/21/throttling-function-calls

http://benalman.com/projects/jquery-throttle-debounce-plugin/

bhavya_w avatar Sep 23 '14 16:09 bhavya_w
Aceptado

Para decirlo en términos simples:

  • La limitación retrasará la ejecución de una función. Reducirá las notificaciones de un evento que se activa varias veces.
  • La eliminación de rebotes agrupará una serie de llamadas secuenciales a una función en una sola llamada a esa función. Garantiza que se realice una notificación para un evento que se activa varias veces.

Puede ver visualmente la diferencia en esta demostración , que muestra cuándo se activaría un evento rebotado o limitado en función del movimiento del mouse.

Si tiene una función que se llama con frecuencia, por ejemplo, cuando ocurre un cambio de tamaño o un evento de movimiento del mouse, se puede llamar muchas veces. Si no desea este comportamiento, puede limitarlo para que la función se llame a intervalos regulares. La eliminación de rebotes significará que se llama al final (o al comienzo) de un grupo de eventos.

Donal avatar Sep 23 '2014 09:09 Donal

Personalmente, encontré que el rebote es más difícil de comprender que el acelerador .

Ya que ambas funciones le ayudan a posponer y reducir la tasa de ejecución. Suponiendo que está llamando a funciones decoradas devueltas por aceleración/antirrebote repetidamente...

  • Acelerador : la función original se llamará como máximo una vez por período especificado.
  • Antirrebote : la función original se llamará después de que la persona que llama deje de llamar a la función decorada después de un período específico .

La última parte del rebote me pareció crucial para comprender el objetivo que intenta alcanzar. También encontré que una versión antigua de la implementación de _.debounce ayuda a comprender (cortesía de https://davidwalsh.name/function-debounce ).

// Returns a function, that, as long as it continues to be invoked, will not
// be triggered. The function will be called after it stops being called for
// N milliseconds. If `immediate` is passed, trigger the function on the
// leading edge, instead of the trailing.
_.debounce = function(func, wait, immediate) {
  var timeout;
  return function() {
    var context = this, args = arguments;
    var later = function() {
        timeout = null;
        if (!immediate) func.apply(context, args);
    };
    var callNow = immediate && !timeout;
    clearTimeout(timeout);
    timeout = setTimeout(later, wait);
    if (callNow) func.apply(context, args);
  };
};

Una metáfora descabellada, pero que quizá también podría ayudar.

Tienes un amigo llamado Chatty al que le gusta hablar contigo por mensajería instantánea. Suponiendo que cuando ella habla envía un mensaje nuevo cada 5 segundos, mientras el ícono de su aplicación de mensajería instantánea rebota hacia arriba y hacia abajo, puede tomar el...

  • Enfoque ingenuo : verifique cada mensaje mientras llega. Cuando el ícono de tu aplicación rebote, compruébalo. No es la forma más efectiva, pero siempre estarás actualizado.
  • Aceleración : se comprueba una vez cada 5 minutos (cuando hay nuevas). Cuando llegue un mensaje nuevo, si lo ha marcado en algún momento de los últimos 5 minutos, ignórelo. Ahorrará tiempo con este enfoque, mientras aún está al tanto.
  • Enfoque antirrebote : ya conoces a Chatty, ella descompone una historia completa en pedazos y los envía un mensaje tras otro. Esperas hasta que Chatty termine toda la historia: si deja de enviar mensajes durante 5 minutos, asumirías que ha terminado, ahora revisas todo.
Dapeng Li avatar Feb 09 '2016 11:02 Dapeng Li

Diferencias

Acelerar 1 seg. Rebote 1 seg.
Demora Sin demora 1 segundo de retraso
Emite nuevo si... Ha pasado 1 segundo
desde la última salida.
Después de la última entrada,
el siguiente 1 segundo no tiene ninguna entrada nueva

Explicación por caso de uso

  • Barra de búsqueda : ¿No desea buscar cada vez que el usuario presiona una tecla? ¿Prefiere buscar después de que el usuario dejó de escribir durante 1 segundo? Use debounce1 segundo al presionar la tecla.

  • Juego de disparos : la pistola tarda 1 segundo entre cada disparo, pero el usuario hace clic con el mouse varias veces en 1 segundo. El uso throttleal hacer clic con el mouse garantiza que se ignoren los clics que se realizan demasiado pronto.

Invirtiendo sus roles

  • Limitación de 1 segundo en la barra de búsqueda : si un usuario escribe "abcdefghij", y cada carácter subsiguiente se escribe cada 0,6 segundos, se throttleactivará al presionar la primera "a". Luego ignorará cada pulsación durante el siguiente segundo; es decir, se ignorará "b" en la marca de 0,6 segundos. Luego, "c" a los 1,2 segundos activará nuevamente una búsqueda, que luego restablece el tiempo nuevamente, y así sucesivamente para las claves posteriores (por ejemplo, "d" a los 1,8 segundos se ignorará, pero "e" a los 2,4 se activará, etc.) .

  • Antirrebote de la pistola durante 1 segundo : cuando un usuario ve un enemigo, hace clic con el mouse, pero no disparará. Hará clic nuevamente varias veces en ese segundo pero aún así no disparará. Sólo después de cesar sus clics durante un segundo completo la pistola finalmente disparará, un solo tiro.

Una comparación de la "vida real"

Hay algunos guardias afuera de un bar. Los guardias permiten que una persona que diga "Quiero entrar" entre al bar. Este es un escenario normal. Cualquiera que diga "Quiero entrar" puede entrar al bar.

Ahora hay un protector del acelerador ( acelera 5 segundos ). Le gusta la gente que responde primero. Cualquiera que diga "Iré" primero, le permitirá entrar. Luego rechaza a todas las personas durante los siguientes 5 segundos . Después de eso, nuevamente se permitirá a cualquiera que lo diga primero y los demás serán rechazados durante los siguientes 5 segundos .

Hay otro guardia, el guardia antirrebote ( antirrebote 5 segundos ). Le gustan las personas que le brindan descanso mental durante 5 segundos . Entonces, si alguna persona dice "Iré", el guardia espera 5 segundos . Si ninguna otra persona lo molesta en esos 5 segundos, permite que la primera persona entre. Pero, si alguna otra persona interrumpe y dice "voy a ir" en esos 5 segundos , rechazará al primero, y nuevamente comenzará los 5 segundos de espera, esta vez para la segunda persona. Si ahora pasan 5 segundos sin interrupción, se dejará entrar a esa segunda persona, pero no a la primera.

amitdigga avatar Sep 05 '2018 19:09 amitdigga