Czy ktoś może mi w prosty sposób wyjaśnić różnicę między ograniczaniem a ogłaszaniem funkcji w celu ograniczenia prędkości.
Wydaje mi się, że oboje robią to samo. Sprawdziłem te dwa blogi, aby się dowiedzieć:
http://remysharp.com/2010/07/21/throttling-function-calls
http://benalman.com/projects/jquery-throttle-debounce-plugin/
javascript
bhavya_w
źródło
źródło
Odpowiedzi:
Krótko mówiąc:
Można naocznie zobaczyć różnicę tutaj
Jeśli masz funkcję, która jest często wywoływana - na przykład, gdy występuje zdarzenie zmiany rozmiaru lub ruchu myszy, można ją wywołać wiele razy. Jeśli nie chcesz tego zachowania można Przepustnica go tak, że funkcja jest wywoływana w regularnych odstępach czasu. Ogłoszenie oznacza, że jest wywoływane na końcu (lub na początku) szeregu zdarzeń.
źródło
Osobiście uważałem, że debounce jest trudniejsze do zrozumienia niż przepustnica .
Ponieważ obie funkcje pomagają odłożyć w czasie i zmniejszyć szybkość niektórych operacji. Zakładając, że wywołujesz funkcje ozdobne zwracane przez przepustnicę / debounce wielokrotnie ...
Uważam, że ostatnia część debaty jest kluczowa dla zrozumienia celu, który próbuje osiągnąć. Znalazłem też starą wersję implementacji _.debounce, która pomaga zrozumieć (dzięki uprzejmości https://davidwalsh.name/function-debounce ).
Niejasna metafora, ale może też może pomóc.
Masz znajomego o imieniu Chatty, który lubi z tobą rozmawiać przez komunikator. Zakładając, że kiedy mówi, wysyła nową wiadomość co 5 sekund, a ikona aplikacji czatu przesuwa się w górę iw dół, możesz ...
źródło
Różnice
Objaśnienie według przypadku użycia :
Pasek wyszukiwania - nie chcesz wyszukiwać za każdym razem, gdy użytkownik naciska klawisz? Chcesz wyszukać, gdy użytkownik przestał pisać na 1 sekundę. Użyj
debounce
1 sekundy po naciśnięciu klawisza.Strzelanie - pistolet trwa 1 sekundę między każdym strzałem, ale użytkownik kliknie myszą wiele razy. Użyj
throttle
po kliknięciu myszą.Odwracanie ich ról :
Ograniczanie 1 sek. Na pasku wyszukiwania - jeśli użytkownicy wpisują
abcdefghij
każdą postać0.6 sec
. Następnie przepustnica uruchomi się przy pierwszyma
naciśnięciu. Będzie ignorował każde naciśnięcie przez następną 1 sekundę, tj.b
Przy 0,6 sekundy zostanie zignorowany. Następniec
po 1,2 sek ponownie uruchomi się, co ponownie wyzeruje czas.d
Zostaną więc zignorowane ie
zostaną uruchomione.Ogłaszając pistolet na 1 sekundę - Gdy użytkownik zobaczy wroga, klika myszką, ale nie strzela. Kliknie ponownie kilka razy w tej sekundzie, ale nie będzie strzelać. Zobaczy, czy nadal ma pociski, w tym czasie (1 sekundę po ostatnim kliknięciu) pistolet będzie strzelał automatycznie.
źródło
Ograniczanie wymusza maksymalną liczbę wywołań funkcji w czasie. Jak w „wykonaj tę funkcję co najwyżej raz na 100 milisekund”.
Odwołanie wymusza, aby funkcja nie była wywoływana ponownie, dopóki upłynie określony czas bez jej wywołania. Jak w „wykonaj tę funkcję tylko wtedy, gdy minęło 100 milisekund bez wywołania”.
ref
źródło
Przepustnica (1 sek): Cześć, jestem robotem. Tak długo, jak będziesz mnie pingować, będę z tobą rozmawiać, ale po dokładnie 1 sekundzie. Jeśli wyślesz mi ping do odpowiedzi, zanim upłynie sekunda, nadal będę odpowiadać ci dokładnie co 1 sekundę. Innymi słowy, po prostu uwielbiam odpowiadać w dokładnych odstępach czasu.
Debounce (1 sec): Cześć, jestem kuzynem robota ^^. Tak długo, jak będziesz pingował mnie, będę milczeć, ponieważ lubię odpowiadać dopiero po upływie 1 sekundy od ostatniego pingowania mnie . Nie wiem, czy to dlatego, że mam problem z postawą, czy po prostu nie lubię przeszkadzać ludziom. Innymi słowy, jeśli będziesz prosił mnie o odpowiedzi przed upływem 1 sekundy od ostatniego wywołania, nigdy nie otrzymasz odpowiedzi. Tak, tak ... śmiało! nazywaj mnie niegrzecznym.
Przepustnica (10 min): Jestem maszyną do pozyskiwania drewna. Wysyłam dzienniki systemowe do naszego serwera zaplecza, po regularnych odstępach 10 minut.
Debounce (10 sec): Cześć, nie jestem kuzynem tej maszyny do logowania. (Nie każdy debiutant jest powiązany z przepustnicą w tym wymyślonym świecie). Pracuję jako kelner w pobliskiej restauracji. Powinienem poinformować cię, że dopóki będziesz dodawać rzeczy do swojego zamówienia, nie pójdę do kuchni w celu wykonania twojego zamówienia. Dopiero po upływie 10 sekund od ostatniej modyfikacji zamówienia założę, że zamówienie zostało zakończone. Dopiero wtedy zrealizuję twoje zamówienie w kuchni.
Fajne dema: https://css-tricks.com/debouncing-throttling-explained-examples/
Kredyty dla analogii kelnera: https://codeburst.io/throttling-and-debouncing-in-javascript-b01cad5c8edf
źródło
Funkcja ogłaszania umożliwia zarządzanie częstotliwością połączeń odbieranych przez funkcję. Łączy wiele wywołań, które występują w danej funkcji, dzięki czemu powtarzane połączenia, które występują przed upływem określonego czasu, są ignorowane. Zasadniczo ogłaszanie zapewnia wysłanie dokładnie jednego sygnału dla zdarzenia, które może wystąpić kilka razy.
Dławienie ogranicza częstotliwość połączeń, że funkcja otrzymuje z ustalonym przedziale czasowym. Służy do zapewnienia, że funkcja docelowa nie będzie wywoływana częściej niż określone opóźnienie. Ograniczanie to zmniejszenie częstości powtarzających się zdarzeń.
źródło
To proste.
Robią dokładnie to samo (ograniczenie prędkości), z wyjątkiem sytuacji, gdy wywoływana jest przepustnica, będzie ona okresowo uruchamiała twoją zawiniętą funkcję, a debounce nie. Debounce po prostu (próbuje) wywołać twoją funkcję raz na samym końcu.
Przykład : Jeśli przewijasz, przepustnica będzie powoli wywoływać twoją funkcję podczas przewijania (co X milisekund). Debounce poczeka, aż skończysz przewijanie, aby wywołać twoją funkcję.
źródło
W kategoriach laika:
Odwołanie uniemożliwi działanie funkcji, gdy jest ona często wywoływana. Zadeklarowana funkcja będzie działać dopiero po ustaleniu, że nie jest już wywoływana, w którym to momencie uruchomi się dokładnie raz. Praktyczne przykłady ogłaszania:
Automatyczne zapisywanie lub sprawdzanie poprawności zawartości pola tekstowego, jeśli użytkownik „przestał pisać”: operacja zostanie wykonana tylko raz, PO ustaleniu, że użytkownik nie pisze już (nie naciska już klawiszy).
Rejestrowanie w miejscu, gdzie użytkownicy spoczywają na myszy: użytkownik nie porusza już myszą, dzięki czemu można zapisać (ostatnią) pozycję.
Ograniczanie po prostu uniemożliwi uruchamianie funkcji, jeśli ostatnio działała, niezależnie od częstotliwości wywołań. Praktyczne przykłady ograniczania:
źródło
Prawdziwa analogia, która osobiście pomaga mi zapamiętać:
Przypadki użycia do debounce :
Przypadki użycia przepustnicy :
źródło
throtle jest tylko nakładką na opóźnieniu na co sprawia nieczułości telefonowania przeszedł
function
w pewnym okresie czasu, jeśli nieczułości opóźnia wywołanie funkcji na okres czasu, który jest większy niż określony w throtle .źródło
lodash Biblioteka proponuje następujący artykuł https://css-tricks.com/debouncing-throttling-explained-examples/ który szczegółowo wyjaśnić różnicę między
Debounce
iThrottle
ich powstawanieźródło
Dławienie
Ogłaszając
Być może funkcja jest wywoływana 1000 razy w szybkiej serii, rozproszona na 3 sekundy, a następnie przestaje być wywoływana. Jeśli zadebiutowałeś w 100 milisekundach, funkcja uruchomi się tylko raz, w 3,1 sekundy, po zakończeniu serii. Za każdym razem, gdy funkcja jest wywoływana podczas serii, resetuje licznik ogłaszający
źródło: - przepustnica i zapowiedź
źródło
Załóżmy, że mamy funkcję zwrotną „cb”, która ma być wywoływana w przypadku zdarzenia „E”. Niech „E” zostanie wywołane 1000 razy w ciągu 1 sekundy, stąd będzie 1000 połączeń z „cb”. To jest 1 rozmowa / ms. Aby zoptymalizować, możemy użyć:
źródło
O ile rozumiem, w prostych słowach Ograniczanie - podobne do wywoływania setInterval (oddzwanianie) przez określoną liczbę razy, tj. Wywoływanie tej samej funkcji przez określoną liczbę razy w czasie po wystąpieniu zdarzenia i .. Ogłoszenie - podobne do wywoływania setTImeout (callbackForApi) lub wywołanie funkcji po upływie określonego czasu od wystąpienia zdarzenia. Ten link może być pomocny- https://css-tricks.com/the-difference-between-throttling-and-debouncing/
źródło