首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redux Saga中的Debounce

Redux Saga中的Debounce
EN

Stack Overflow用户
提问于 2020-09-17 11:56:38
回答 1查看 190关注 0票数 0

我发现了这个有用的小函数,可以根据Redux Saga中保存的键来调节

代码语言:javascript
复制
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)
      }
    }
  }

我现在正试着让它去反弹。所以你总是得到最后一个。

有什么线索可以做到这点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-17 12:18:53

当操作第一次发生时,您可以派生一个设置延迟的任务,然后调用saga,并保存任务对象。如果该操作在不久之后再次发生,您将取消该任务并启动另一个任务。一旦经过了足够长的时间而没有采取任何行动,最后一个任务将使其通过其延迟,并调用传奇。

代码语言:javascript
复制
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)
  }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63931040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档