Add throttle utility as an improved debounce
This commit is contained in:
parent
09f2cc1f72
commit
e9769b0721
|
@ -4,6 +4,8 @@
|
||||||
* @param fn the async function to run
|
* @param fn the async function to run
|
||||||
* @return {Promise} a sequential version of the function
|
* @return {Promise} a sequential version of the function
|
||||||
*/
|
*/
|
||||||
|
import { lastIndexOf } from "lodash/array"
|
||||||
|
|
||||||
export const sequential = fn => {
|
export const sequential = fn => {
|
||||||
let queue = []
|
let queue = []
|
||||||
return async (...params) => {
|
return async (...params) => {
|
||||||
|
@ -40,3 +42,37 @@ export const debounce = (callback, minDelay = 1000) => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility to throttle invocations of a synchronous function. This is better
|
||||||
|
* than a simple debounce invocation for a number of reasons. Features include:
|
||||||
|
* - First invocation is immediate (no initial delay)
|
||||||
|
* - Every invocation has the latest params (no stale params)
|
||||||
|
* - There will always be a final invocation with the last params (no missing
|
||||||
|
* final update)
|
||||||
|
* @param callback
|
||||||
|
* @param minDelay
|
||||||
|
* @returns {Function} a throttled version function
|
||||||
|
*/
|
||||||
|
export const throttle = (callback, minDelay = 1000) => {
|
||||||
|
let lastParams
|
||||||
|
let stalled = false
|
||||||
|
let pending = false
|
||||||
|
const invoke = (...params) => {
|
||||||
|
lastParams = params
|
||||||
|
if (stalled) {
|
||||||
|
pending = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
callback(...lastParams)
|
||||||
|
stalled = true
|
||||||
|
setTimeout(() => {
|
||||||
|
stalled = false
|
||||||
|
if (pending) {
|
||||||
|
pending = false
|
||||||
|
invoke(...lastParams)
|
||||||
|
}
|
||||||
|
}, minDelay)
|
||||||
|
}
|
||||||
|
return invoke
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue