gpt4 book ai didi

redux-saga - redux saga,有条件地节流/去抖动?

转载 作者:行者123 更新时间:2023-12-01 15:40:42 28 4
gpt4 key购买 nike

当它在屏幕上可见时,我正在记录横幅展示次数。

当用户滚动时,同一条横幅可以在短时间内多次显示。

我想防止这种情况发生。

乍一看,throttle是防止它的完美方法。

但是,当您在一页中有多个横幅时,throttle如果受到限制,将不会在屏幕中记录第二个横幅。

那么我怎样才能限制每个键呢? (此示例中,横幅 id 作为键)
即,我想限制每个banner_id 的横幅展示次数。 (就像服务器限制每个 api key 的 api_endpoint 访问)

编辑

可以考虑创建 throttle对于每个键,但想知道它是否会占用太多资源?

我想知道 Django-rest-framework 等 API 库如何实现每个 api 键的节流。我想这可能与传奇 throttle 的作用完全不同。

最佳答案

使用过期 map

django-rest 这样的事情使用过期 map 进行节流。一个可过期的集合也足以完成该任务。

不幸的是,我不能为可过期的 map/set 推荐一个确切的 npm 模块。

伪代码:

function* throttlePerKey(pattern, selector, timeout, saga) {
const set = new ExpirableSet({ expire: timeout })

while(true) {
const action = yield take(pattern)
const id = selector(action)
const throttled = set.has(id)
if (throttled) {
// Do nothing, action throttled
} else {
set.add(id)
yield call(saga, action)
}
}
}

仅使用 redux-saga

我们可以用 redux-saga 模拟一个 expirable set,得到一个纯粹的 redux-saga 解决方案。

编码:

function* throttlePerKey(pattern, selector, timeout, saga) {
const set = new Set()

while(true) {
const action = yield take(pattern)
const id = selector(action)
const throttled = set.has(id)
if (throttled) {
// Do nothing, action throttled
} else {
set.add(id)
// Expire items after timeout
yield fork(function* () {
yield delay(timeout)
set.delete(id)
})
yield call(saga, action)
}
}
}

关于redux-saga - redux saga,有条件地节流/去抖动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52815544/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com