分享
三行代码  ›  专栏  ›  技术社区  ›  beek

《红楼梦》中的德邦

  •  0
  • beek  · 技术社区  · 1 周前

    我发现这个有用的小函数可以根据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)
          }
        }
      }
    

    有什么线索吗?

    1 回复  |  直到 1 周前
        1
  •  1
  •   Nicholas Tower    1 周前

    当操作第一次发生时,您可以分叉一个设置延迟的任务,然后调用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)
      }
    }