在 Redux Saga 中去抖动
Debounce in Redux Saga
我发现这个有用的小功能可以根据在 Redux Saga 中保存的键进行节流
export default function* throttlePerKey(pattern:string, selector: Function, timeout:number, saga:any) {
const set = new Set()
while(true) {
const action = yield take(pattern)
const id = selector(action)
const throttled = set.has(id)
if (throttled) {
} else {
set.add(id)
// Expire items after timeout
yield fork(function* () {
yield delay(timeout)
set.delete(id)
})
yield call(saga, action)
}
}
}
我现在正在尝试让它去抖动。所以你总是得到最后一个。
任何线索如何做到这一点?
当操作第一次发生时,您可以派生一个设置延迟的任务,然后调用 saga,并保存任务对象。如果此操作很快发生第二次,您将取消任务并开始另一个任务。一旦经过足够长的时间而没有任何操作,最后一个任务将超过其延迟,并调用 saga。
export default function* debouncePerKey(pattern:string, selector: Function, timeout:number, saga:any) {
const map = new Map()
while(true) {
const action = yield take(pattern)
const id = selector(action)
const existingTask = map.get(id)
if (existingTask) {
yield cancel(existingTask)
}
const newTask = yield fork(function* () {
yield delay(timeout)
map.delete(id)
yield call(saga, action)
})
map.set(id, newTask)
}
}
我发现这个有用的小功能可以根据在 Redux Saga 中保存的键进行节流
export default function* throttlePerKey(pattern:string, selector: Function, timeout:number, saga:any) {
const set = new Set()
while(true) {
const action = yield take(pattern)
const id = selector(action)
const throttled = set.has(id)
if (throttled) {
} else {
set.add(id)
// Expire items after timeout
yield fork(function* () {
yield delay(timeout)
set.delete(id)
})
yield call(saga, action)
}
}
}
我现在正在尝试让它去抖动。所以你总是得到最后一个。
任何线索如何做到这一点?
当操作第一次发生时,您可以派生一个设置延迟的任务,然后调用 saga,并保存任务对象。如果此操作很快发生第二次,您将取消任务并开始另一个任务。一旦经过足够长的时间而没有任何操作,最后一个任务将超过其延迟,并调用 saga。
export default function* debouncePerKey(pattern:string, selector: Function, timeout:number, saga:any) {
const map = new Map()
while(true) {
const action = yield take(pattern)
const id = selector(action)
const existingTask = map.get(id)
if (existingTask) {
yield cancel(existingTask)
}
const newTask = yield fork(function* () {
yield delay(timeout)
map.delete(id)
yield call(saga, action)
})
map.set(id, newTask)
}
}