Adakah yang bisa memberi saya penjelasan sederhana-kata tentang perbedaan antara melambatkan dan melemahkan fungsi untuk tujuan pembatasan tingkat.
Bagi saya keduanya tampaknya melakukan hal yang sama. Saya telah memeriksa dua blog ini untuk mencari tahu:
http://remysharp.com/2010/07/21/throttling-function-calls
http://benalman.com/projects/jquery-throttle-debounce-plugin/
javascript
bhavya_w
sumber
sumber
Jawaban:
Secara sederhana:
Anda dapat melihat perbedaannya secara visual di sini
Jika Anda memiliki fungsi yang sering dipanggil - misalnya saat acara pengubahan ukuran atau perpindahan mouse, ini dapat disebut berkali-kali. Jika Anda tidak menginginkan perilaku ini, Anda dapat mencekiknya sehingga fungsinya dipanggil secara berkala. Debouncing berarti itu disebut pada akhir (atau awal) dari banyak peristiwa.
sumber
Secara pribadi saya temukan debounce lebih sulit untuk dipahami daripada throttle .
Karena kedua fungsi ini membantu Anda menunda dan mengurangi laju beberapa eksekusi. Anggap Anda memanggil fungsi-fungsi yang dihiasi yang dikembalikan oleh throttle / debounce berulang kali ...
Saya menemukan bagian terakhir debounce penting untuk memahami tujuan yang ingin dicapai. Saya juga menemukan versi lama implementasi _.debounce membantu pemahaman (milik https://davidwalsh.name/function-debounce ).
Metafora yang dibuat-buat, tapi mungkin juga bisa membantu.
Anda memiliki teman bernama Chatty yang suka berbicara dengan Anda melalui IM. Dengan asumsi ketika dia berbicara dia mengirim pesan baru setiap 5 detik, sementara ikon aplikasi IM Anda memantul ke atas dan ke bawah, Anda dapat ...
sumber
Perbedaan
Penjelasan berdasarkan use case :
Bilah pencarian - Tidak ingin mencari setiap kali pengguna menekan tombol? Ingin mencari ketika pengguna berhenti mengetik selama 1 detik. Gunakan
debounce
1 detik pada tombol tekan.Shooting game - Pistol mengambil 1 detik waktu antara setiap tembakan tetapi pengguna mengklik mouse beberapa kali. Gunakan
throttle
pada klik mouse.Membalikkan peran mereka :
Pembatasan 1 detik pada bilah pencarian - Jika pengguna mengetik
abcdefghij
dengan setiap karakter di0.6 sec
. Kemudian throttle akan memicu padaa
pers pertama . Ini akan mengabaikan setiap pers untuk 1 detik berikutnya yaitub
0,6 detik akan diabaikan. Kemudianc
pada 1,2 detik lagi akan memicu, yang me-reset waktu lagi. Jadid
akan diabaikan dane
akan dipicu.Menembakkan pistol selama 1 detik - Saat pengguna melihat musuh, ia mengklik mouse, tetapi tidak akan menembak. Dia akan mengklik lagi beberapa kali dalam detik itu tetapi tidak akan menembak. Dia akan melihat apakah masih ada peluru, pada saat itu (1 detik setelah klik terakhir) pistol akan menembak secara otomatis.
sumber
Pelambatan memberlakukan jumlah maksimum suatu fungsi yang dapat dipanggil dari waktu ke waktu. Seperti pada "jalankan fungsi ini paling banyak sekali setiap 100 milidetik."
Debouncing memberlakukan bahwa suatu fungsi tidak dipanggil lagi sampai sejumlah waktu telah berlalu tanpa dipanggil. Seperti dalam "jalankan fungsi ini hanya jika 100 milidetik telah berlalu tanpa dipanggil."
ref
sumber
Throttle (1 detik): Halo, saya seorang robot. Selama Anda terus mem-ping saya, saya akan terus berbicara dengan Anda, tetapi setelah masing-masing tepat 1 detik. Jika Anda mem-ping saya untuk balasan sebelum sedetik berlalu, saya masih akan membalas Anda tepat pada interval 1 detik. Dengan kata lain, saya suka sekali membalas pada interval yang tepat.
Debounce (1 dtk): Hai, saya adalah sepupu robot ^^ itu. Selama Anda terus mem-ping saya, saya akan tetap diam karena saya ingin membalas hanya setelah 1 detik berlalu sejak terakhir kali Anda mem-ping saya . Saya tidak tahu, apakah itu karena saya memiliki masalah sikap atau karena saya tidak suka mengganggu orang. Dengan kata lain, jika Anda terus meminta saya untuk balasan sebelum 1 detik telah berlalu sejak doa terakhir Anda, Anda tidak akan pernah mendapat balasan. Yeah yeah ... silakan! panggil aku kasar.
Throttle (10 mnt): Saya adalah mesin logging. Saya mengirim log sistem ke server backend kami, setelah interval reguler 10 menit.
Debounce (10 detik): Hai, saya bukan sepupu dari mesin logging itu. (Tidak semua debouncer terkait dengan throttler di dunia imajiner ini). Saya bekerja sebagai pelayan di restoran terdekat. Saya harus memberi tahu Anda bahwa selama Anda terus menambahkan barang ke pesanan Anda, saya tidak akan pergi ke dapur untuk melaksanakan pesanan Anda. Hanya ketika 10 detik telah berlalu setelah Anda terakhir mengubah pesanan Anda, saya akan menganggap bahwa Anda selesai dengan pesanan Anda. Baru setelah itu saya akan melaksanakan pesanan Anda di dapur.
Demo Keren: https://css-tricks.com/debouncing-throttling-explained-examples/
Penghargaan untuk analogi pelayan: https://codeburst.io/throttling-and-debouncing-in-javascript-b01cad5c8edf
sumber
Debouncing memungkinkan Anda untuk mengatur frekuensi panggilan yang dapat diterima fungsi. Ini menggabungkan beberapa panggilan yang terjadi pada fungsi yang diberikan sehingga panggilan berulang yang terjadi sebelum berakhirnya durasi waktu tertentu diabaikan. Pada dasarnya debouncing memastikan bahwa satu sinyal dikirim untuk suatu peristiwa yang mungkin terjadi beberapa kali.
Throttling membatasi frekuensi panggilan yang diterima suatu fungsi ke interval waktu tertentu. Ini digunakan untuk memastikan bahwa fungsi target tidak dipanggil lebih sering daripada penundaan yang ditentukan. Throttling adalah pengurangan tingkat kejadian berulang.
sumber
Itu mudah.
Mereka melakukan hal yang sama persis (pembatasan tingkat) kecuali ketika throttle sedang dipanggil itu akan menjalankan fungsi Anda yang dibungkus secara berkala, dan debounce tidak akan. Debounce hanya (mencoba) memanggil fungsi Anda sekali di akhir.
Contoh : Jika Anda menggulir, throttle akan memanggil fungsi Anda secara perlahan saat Anda menggulir (setiap X milidetik). Debounce akan menunggu sampai setelah Anda selesai menggulir untuk memanggil fungsi Anda.
sumber
Dalam istilah awam:
Debouncing akan mencegah suatu fungsi berjalan saat masih sering dipanggil. Fungsi yang dideboed hanya akan berjalan setelah telah ditentukan bahwa itu tidak lagi dipanggil, pada titik mana ia akan berjalan tepat sekali. Contoh praktis dari pelepasan:
Menyimpan otomatis atau memvalidasi konten bidang teks jika pengguna "berhenti mengetik": operasi hanya akan dilakukan sekali, SETELAH telah ditentukan bahwa pengguna tidak lagi mengetik (tidak lagi menekan tombol).
Masuk tempat pengguna meletakkan mouse mereka: pengguna tidak lagi menggerakkan mouse mereka, sehingga posisi (terakhir) dapat dicatat.
Throttling hanya akan mencegah fungsi berjalan jika telah berjalan baru-baru ini, terlepas dari frekuensi panggilan. Contoh praktis pelambatan:
sumber
Analogi kehidupan nyata yang secara pribadi membantu saya mengingat:
Gunakan kasing untuk debounce :
Gunakan case untuk throttle :
sumber
throtle hanyalah pembungkus debounce yang membuat debounce untuk panggilan disahkan
function
dalam beberapa periode waktu, jika debounce menunda pemanggilan fungsi pada periode waktu yang lebih besar dari yang ditentukan dalam throtle .sumber
perpustakaan lodash menyarankan artikel berikut https://css-tricks.com/debouncing-throttling-explained-examples/ yang merinci menjelaskan perbedaan antara
Debounce
danThrottle
dan asal usulnyasumber
Pelambatan
Debouncing
Mungkin fungsi dipanggil 1.000 kali dalam ledakan cepat, tersebar lebih dari 3 detik, lalu berhenti dipanggil. Jika Anda telah melonggarkannya pada 100 milidetik, fungsi hanya akan menyala sekali, pada 3,1 detik, setelah ledakan selesai. Setiap kali fungsi dipanggil selama burst itu me-reset timer debouncing
sumber: - throttle dan debouncing
sumber
Misalkan kita memiliki fungsi panggilan balik "cb" untuk dipanggil pada acara "E". Biarkan "E" dipicu 1000 kali dalam 1 detik, maka akan ada 1000 panggilan ke "cb". Itu adalah 1 panggilan / ms. Untuk mengoptimalkan, kami dapat menggunakan:
sumber
Sejauh yang saya mengerti, secara sederhana Throttling - mirip dengan memanggil setInterval (panggilan balik) untuk beberapa kali yaitu memanggil fungsi yang sama untuk beberapa kali dari waktu ke waktu terjadinya peristiwa dan .. Debouncing - mirip dengan memanggil setTImeout (callbackForApi) atau memanggil fungsi setelah waktu tertentu berlalu pada terjadinya acara. Tautan ini dapat membantu- https://css-tricks.com/the-ddference-between-throttling-and-debouncing/
sumber