Alguém pode me dar uma explicação em palavras simples sobre a diferença entre limitar e rebater uma função para fins de limitação de taxa.
Para mim, os dois parecem fazer o mesmo. Eu verifiquei esses dois blogs para descobrir:
http://remysharp.com/2010/07/21/throttling-function-calls
http://benalman.com/projects/jquery-throttle-debounce-plugin/
javascript
bhavya_w
fonte
fonte
Respostas:
Para colocar em termos simples:
Você pode ver visualmente a diferença aqui
Se você tem uma função que é chamada muito - por exemplo, quando um evento de redimensionamento ou movimentação do mouse ocorre, ela pode ser chamada várias vezes. Se você não quiser esse comportamento, poderá regulá- lo para que a função seja chamada em intervalos regulares. Debouncing significa que é chamado no final (ou no início) de vários eventos.
fonte
Pessoalmente, achei o debounce mais difícil de compreender do que o acelerador .
Como ambas as funções ajudam a adiar e reduzir a taxa de alguma execução. Supondo que você esteja chamando funções decoradas retornadas por acelerador / debounce repetidamente ...
Eu achei a última parte do debounce crucial para entender o objetivo que ele está tentando alcançar. Também achei que uma versão antiga da implementação do _.debounce ajuda a entender (cortesia de https://davidwalsh.name/function-debounce ).
Uma metáfora absurda, mas talvez também possa ajudar.
Você tem um amigo chamado Chatty que gosta de conversar com você via IM. Supondo que, quando ela fala, ela envia uma nova mensagem a cada 5 segundos, enquanto o ícone do seu aplicativo de IM está pulando para cima e para baixo, você pode ...
fonte
Diferenças
Explicação por caso de uso :
Barra de pesquisa - não deseja pesquisar sempre que o usuário pressionar a tecla? Deseja pesquisar quando o usuário parou de digitar por 1 segundo. Use
debounce
1 segundo ao pressionar a tecla.Jogo de tiro - A pistola demora 1 s entre cada tiro, mas o usuário clica no mouse várias vezes. Use
throttle
no clique do mouse.Invertendo seus papéis :
Limitação de 1 segundo na barra de pesquisa - se os usuários digitarem
abcdefghij
com todos os caracteres0.6 sec
. O acelerador será acionado na primeiraa
pressão. Irá ignorar cada pressão nos próximos 1 segundo, ou seja,b
em 0,6 seg. Será ignorado. Então,c
a 1,2 s será acionado novamente, o que redefine a hora novamente. Portantod
, será ignorado ee
será acionado.Revolver a pistola por 1 s - Quando o usuário vê um inimigo, ele clica no mouse, mas ele não atira. Ele clicará novamente várias vezes naquele segundo, mas não disparará. Ele vai ver se ele ainda possui balas, naquele momento (1 segundo após o último clique) a pistola dispara automaticamente.
fonte
A otimização aplica um número máximo de vezes que uma função pode ser chamada ao longo do tempo. Como em "execute esta função no máximo uma vez a cada 100 milissegundos".
A depuração impõe que uma função não seja chamada novamente até que um certo período de tempo tenha passado sem que ela seja chamada. Como em "execute esta função somente se 100 milissegundos se passaram sem que ela seja chamada".
ref
fonte
Regulador de pressão (1 s): Olá, sou um robô. Enquanto você continuar me pingando, continuarei falando com você, mas depois de exatamente 1 segundo cada. Se você me enviar uma resposta antes que um segundo se esgote, continuarei respondendo a você exatamente em 1 segundo. Em outras palavras, adoro responder em intervalos exatos.
Debounce (1 s): Olá, sou o primo do robô ^^. Enquanto você continuar me enviando um ping, continuarei em silêncio, porque eu gostaria de responder apenas depois de 1 segundo desde a última vez que você me enviou um ping . Não sei, se é porque tenho um problema de atitude ou porque simplesmente não gosto de interromper as pessoas. Em outras palavras, se você continuar me pedindo respostas antes de decorrido 1 segundo desde a sua última chamada, nunca receberá uma resposta. Sim, sim ... vá em frente! me chame de rude.
Regulador de pressão (10 min): Eu sou uma máquina de registro. Eu envio logs do sistema para o servidor back-end, após um intervalo regular de 10 minutos.
Debounce (10 s): Olá, eu não sou primo dessa máquina de registro. (Nem todo debouncer está relacionado a um regulador de pressão neste mundo imaginário). Eu trabalho como garçom em um restaurante próximo. Devo informar que, enquanto continuar adicionando coisas ao seu pedido, não irei à cozinha para executar seu pedido. Somente depois de decorridos 10 segundos após a última modificação do seu pedido, assumirei que você terminou o pedido. Só então executarei seu pedido na cozinha.
Demonstrações legais: https://css-tricks.com/debouncing-throttling-explained-examples/
Créditos para a analogia do garçom: https://codeburst.io/throttling-and-debouncing-in-javascript-b01cad5c8edf
fonte
A rejeição permite gerenciar a frequência das chamadas que uma função pode receber. Ele combina várias chamadas que acontecem em uma determinada função para que as chamadas repetidas que ocorrem antes da expiração de um período de tempo específico sejam ignoradas. Basicamente, a rejeição garante que exatamente um sinal seja enviado para um evento que pode estar acontecendo várias vezes.
A limitação restringe a frequência de chamadas que uma função recebe por um intervalo de tempo fixo. É usado para garantir que a função de destino não seja chamada com mais frequência que o atraso especificado. A limitação é a redução na taxa de um evento repetido.
fonte
É simples.
Eles fazem exatamente a mesma coisa (limitação de taxa), exceto enquanto o acelerador é chamado, ele dispara sua função empacotada periodicamente e o debounce não. Debounce apenas (tenta) chamar sua função uma vez no final.
Exemplo : se você estiver rolando, o acelerador chamará sua função lentamente enquanto você rola (a cada X milissegundos). O Debounce esperará até depois de terminar a rolagem para chamar sua função.
fonte
Em termos leigos:
A rejeição impedirá que uma função seja executada enquanto ainda estiver sendo chamada com freqüência. Uma função rejeitada será executada somente depois de ter sido determinado que não está mais sendo chamada e, nesse ponto, será executada exatamente uma vez. Exemplos práticos de devolução:
Salvamento automático ou validação do conteúdo de um campo de texto se o usuário "parou de digitar": a operação será realizada apenas uma vez, APÓS ter sido determinado que o usuário não está mais digitando (não pressionando mais as teclas).
Registrando onde os usuários pousam o mouse: o usuário não está mais movendo o mouse, para que a (última) posição possa ser registrada.
A limitação simplesmente impedirá que uma função seja executada se executada recentemente, independentemente da frequência da chamada. Exemplos práticos de limitação:
fonte
Uma analogia da vida real que pessoalmente me ajuda a lembrar:
Casos de uso para rejeição :
Casos de uso para aceleração :
fonte
throtle é apenas um invólucro em torno debounce que torna debounce para chamar passou
function
em algum período de tempo, se debounce atrasa uma chamada de função no período de tempo que é maior, então especificado no throtle .fonte
o lodash Biblioteca sugere a seguinte artigo https://css-tricks.com/debouncing-throttling-explained-examples/ que detalhou explicar a diferença entre
Debounce
eThrottle
e sua origemfonte
Limitação
Debouncing
Talvez uma função seja chamada 1.000 vezes em uma explosão rápida, dispersa por 3 segundos e depois deixe de ser chamada. Se você o tiver devolvido a 100 milissegundos, a função será acionada apenas uma vez, em 3,1 segundos, depois que a explosão terminar. Cada vez que a função é chamada durante o burst, ela redefine o timer de recuperação
fonte: - acelerador e debouncing
fonte
Suponha que tenhamos uma função de retorno de chamada "cb" a ser chamada no evento "E". Deixe "E" ser acionado 1000 vezes em 1 segundo; portanto, haverá 1000 chamadas para "cb". Isso é 1 chamada / ms. Para otimizar, podemos usar:
fonte
Pelo que entendi, em termos simples Throttling - semelhante a chamar setInterval (retorno de chamada) por um certo número de vezes, ou seja, chamar a mesma função por certo número de vezes ao longo do tempo na ocorrência de evento e .. Debouncing - semelhante a chamar setTImeout (callbackForApi) ou chamar uma função após um certo tempo decorrido na ocorrência do evento. Este link pode ser útil- https://css-tricks.com/the-difference-between-throttling-and-debouncing/
fonte