有一个函数 send_log() 负责向后端发送前端日志,由于这个 send_log() 会被其他不同的函数调用,这个调用行为又想限制在一定的频率范围之内(避免频繁请求后端服务器,造成无谓的压力)。
有什么方式,可以限制这个 send_log() 被调用的频率吗(比如每分钟最多 1 次这样)。
function send_log() {
// send data to server
}
有一个函数 send_log() 负责向后端发送前端日志,由于这个 send_log() 会被其他不同的函数调用,这个调用行为又想限制在一定的频率范围之内(避免频繁请求后端服务器,造成无谓的压力)。
有什么方式,可以限制这个 send_log() 被调用的频率吗(比如每分钟最多 1 次这样)。
function send_log() {
// send data to server
}
|
murmurMay 5, 2020
1
搜索 throttle
|
|
murmurMay 5, 2020
2
其实这个最好是建议 debounce,把日志收起来,日志可以考虑编个码 gz 一下啥的,随便扔日志是个好做法么,或者给日志分 debug info error 这样的级别
|
|
lithbitrenMay 5, 2020
3
初始一个 bool 变量为 true,只有变量为 true 才能调用目标函数,每次调用完函数后,bool 变量变成 false,执行 settimeout 让其变成 true 。
|
|
OrenoidMay 5, 2020
4
装饰器+闭包应该就能实现吧
|
|
5
throttle 或者 debounce 会丢失一部分日志
可以先把日志放在本地,每分钟发送一次数据,发送成功之后清空数据 |
|
hanxiaomengMay 5, 2020
7
sleep(60)
|
|
JackWolf001May 5, 2020
8
节流吧
|
|
foamMay 5, 2020 via Android
9
业务层区分日志重要程度,不希望丢的实时发,可以丢的累积发。
|
|
zhennannMay 5, 2020
10
如果是考虑分布式,可用 bottleneck
|
|
cst4youMay 5, 2020
11
log 可以先存起来, 然后到了次数一次发送
|
|
christinMay 6, 2020 via iPhone
12
if ( flag>n) break;
flag++ |
|
keenkillerMay 6, 2020 via Android
13
5 楼正解…或者别限制了,后端塞 kafka 里
|
|
14
let flag = true;
function send_log() { if(flag ){ flag = false; // send data to server // function callback(){setTimeout(()=>{flag = true},1000 * 60)} }else{ return false } } |
|
zjm947373May 6, 2020
15
|
|
theohateonionMay 6, 2020
16
function send_log() {
return throttle(old_send_log, 6000) } 不考虑丢 log 的话就这样就行了 |
|
libookMay 9, 2020
17
函数不直接发送数据,而是把数据存入本地的队列,另一个 setInterval 每隔一段时间把队列里的数据发到服务器,同时清空队列。
其实我觉得后端直接塞消息队列里是可靠性更好的方式。 |