Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 重演传奇中的去盎司_Javascript_Redux_Redux Saga_Debouncing - Fatal编程技术网

Javascript 重演传奇中的去盎司

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(

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

我也在想类似的事情。有什么理由使用地图而不是一个普通的旧物体吗?我自己也会使用一个物体。我只是用一张地图来保持它和你的例子更相似,你的例子用了一个集合。我在想一些类似的东西。有什么理由使用地图而不是一个普通的旧物体吗?我自己也会使用一个物体。我只使用了一个地图来保持它与您的示例更相似,您的示例使用了一个集合。