怎样限制一个 javascript 函数的被调用频率?

2020-05-05 19:10:14 +08:00
 lisisi

有一个函数 send_log() 负责向后端发送前端日志,由于这个 send_log() 会被其他不同的函数调用,这个调用行为又想限制在一定的频率范围之内(避免频繁请求后端服务器,造成无谓的压力)。

有什么方式,可以限制这个 send_log() 被调用的频率吗(比如每分钟最多 1 次这样)。

function send_log() {
    // send data to server
}
3769 次点击
所在节点    JavaScript
17 条回复
murmur
2020-05-05 19:11:18 +08:00
搜索 throttle
murmur
2020-05-05 19:12:13 +08:00
其实这个最好是建议 debounce,把日志收起来,日志可以考虑编个码 gz 一下啥的,随便扔日志是个好做法么,或者给日志分 debug info error 这样的级别
lithbitren
2020-05-05 19:38:34 +08:00
初始一个 bool 变量为 true,只有变量为 true 才能调用目标函数,每次调用完函数后,bool 变量变成 false,执行 settimeout 让其变成 true 。
Orenoid
2020-05-05 19:40:08 +08:00
装饰器+闭包应该就能实现吧
xg4
2020-05-05 19:40:18 +08:00
throttle 或者 debounce 会丢失一部分日志
可以先把日志放在本地,每分钟发送一次数据,发送成功之后清空数据
wunonglin
2020-05-05 19:41:39 +08:00
@xg4 #5 正解
hanxiaomeng
2020-05-05 19:48:32 +08:00
sleep(60)
JackWolf001
2020-05-05 19:50:01 +08:00
节流吧
foam
2020-05-05 19:50:20 +08:00
业务层区分日志重要程度,不希望丢的实时发,可以丢的累积发。
zhennann
2020-05-05 21:58:49 +08:00
如果是考虑分布式,可用 bottleneck
cst4you
2020-05-05 22:30:45 +08:00
log 可以先存起来, 然后到了次数一次发送
christin
2020-05-06 00:47:28 +08:00
if ( flag>n) break;
flag++
tairan2006
2020-05-06 00:54:42 +08:00
5 楼正解…或者别限制了,后端塞 kafka 里
windychen0
2020-05-06 10:04:52 +08:00
let flag = true;
function send_log() {
if(flag ){
flag = false;
// send data to server
// function callback(){setTimeout(()=>{flag = true},1000 * 60)}
}else{
return false
}
}
zjm947373
2020-05-06 10:17:46 +08:00
rxjs 欢迎你
theohateonion
2020-05-06 14:44:46 +08:00
function send_log() {

return throttle(old_send_log, 6000)

}

不考虑丢 log 的话就这样就行了
libook
2020-05-09 18:08:41 +08:00
函数不直接发送数据,而是把数据存入本地的队列,另一个 setInterval 每隔一段时间把队列里的数据发到服务器,同时清空队列。

其实我觉得后端直接塞消息队列里是可靠性更好的方式。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/668724

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX