Javascript 重演传奇中的去盎司
我发现这个有用的小功能可以根据Redux传奇中的哪个键进行节流Javascript 重演传奇中的去盎司,javascript,redux,redux-saga,debouncing,Javascript,Redux,Redux Saga,Debouncing,我发现这个有用的小功能可以根据Redux传奇中的哪个键进行节流 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(
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,并保存任务对象。如果该操作不久后再次发生,您将取消该任务并启动另一个任务。一旦足够长的时间没有采取任何行动,最后一个任务将通过它的延迟,并称之为传奇
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)
}
}
当动作第一次发生时,您可以派生一个设置延迟的任务,然后调用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)
}
}
我也在想类似的事情。有什么理由使用地图而不是一个普通的旧物体吗?我自己也会使用一个物体。我只是用一张地图来保持它和你的例子更相似,你的例子用了一个集合。我在想一些类似的东西。有什么理由使用地图而不是一个普通的旧物体吗?我自己也会使用一个物体。我只使用了一个地图来保持它与您的示例更相似,您的示例使用了一个集合。