V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
lisisi
V2EX  ›  JavaScript

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

  •  
  •   lisisi · 2020-05-05 19:10:14 +08:00 · 3780 次点击
    这是一个创建于 1667 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    return throttle(old_send_log, 6000)

    }

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

    其实我觉得后端直接塞消息队列里是可靠性更好的方式。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5402 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 05:57 · PVG 13:57 · LAX 21:57 · JFK 00:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.