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 ...
- Regulador de pressão : a função original é chamada no máximo uma vez por período especificado.
- Debounce : a função original será chamada depois que o chamador parar de chamar a função decorada após um período especificado .
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 ).
// 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);
};
};
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 ...
- Abordagem ingênua : verifique todas as mensagens desde que cheguem. Quando o ícone do seu aplicativo saltar, verifique. Não é a maneira mais eficaz, mas você está sempre atualizado.
- Abordagem do acelerador : você verifica uma vez a cada 5 minutos (quando houver novos). Quando chegar uma nova mensagem, se você tiver verificado a qualquer momento nos últimos 5 minutos, ignore-a. Você economiza seu tempo com essa abordagem, enquanto ainda está em loop.
- Abordagem de rebate : você conhece Chatty, ela divide toda a história em pedaços, envia-os em uma mensagem após a outra. Você espera até Chatty terminar a história toda: se ela parar de enviar mensagens por 5 minutos, você presumiria que ela terminou, agora você verifica todas.