【问题标题】:Limit function to only running once (even if called multiple times) per 5 minutes将函数限制为每 5 分钟仅运行一次(即使多次调用)
【发布时间】:2020-01-02 02:02:42
【问题描述】:

我的 Express/Node API 中有一个函数,在执行某些操作后,它本质上是对数据进行“汇总”。

用户可以在短时间内多次执行操作(调用 API 路由)。调用此 API 路由后,将调用 roundup 函数。我不希望每次都调用它;例如,每 5 分钟一次(尽管仍然由 API 操作触发)。

我真的只关心 final 调用(因为综述使用该信息来更新其他数据,但早期的没问题,只要它们相距很远(而不是连续的)。

基本上我想要的是: - 即使综合函数被调用 20 次,比如说 5 分钟,也只运行一次

我已经尝试过为此使用 lodash 的 debounce 功能;但它对我来说仍然无法正常工作。

例如...(不是真正的代码,而是基本结构)

function roundup(){
// Do something here, but it's DB intensive and we really only care about the *final call* so only want it to run sometimes (?)

}

// API Route which will call roundup when finished
app.post('/list/join', (req, res) => {
   // my lodash attempt 
   let debounced_roundup = _.debounce(roundup, 300000);
   debounced_roundup();
});

我预计去抖会一直调用综合函数直到延迟 (300000) 之后,但由于 API 调用是单独的,我认为它们不会像我预期的那样触发去抖。

【问题讨论】:

    标签: node.js api express queue limit


    【解决方案1】:

    您需要在您的 post 方法外部创建去抖动器,否则您每次调用 API 时都会创建一个新的、单独的去抖动器实例,它不会知道之前的触发。

    let debounced_roundup = _.debounce(roundup, 300000);
    
    // API Route which will call roundup when finished
    app.post('/list/join', (req, res) => {
       debounced_roundup();
    });
    

    【讨论】:

    • 哎呀,能这么简单吗!?你是一颗宝石,非常感谢。会试一试的。
    • 顺便说一句,如果您不希望 roundup 的执行被每次新调用无限期推迟,您可能需要考虑 throttle 而不是 debounce,这将每五分钟运行一次不超过一次,但如果触发频率高于每五分钟一次,也至少会运行该频率。
    • 我实际上最初使用节流阀,但我认为 debounce 对我来说效果更好。它根本不是时间敏感的,也只需要 last 更新;所以越晚越好。顺便说一句,这很好用。我不敢相信我以前没有得到这个,这么简单!谢谢。
    • 嘿,问你一个简单的问题。如果我希望这是一个“特定于会话”的去抖;我该怎么做呢?我可以访问 API 发布路由中的 req.session,但是如何使用 debounce 仅从同一个会话调用综合函数?现在看起来它会去抖动任何请求;这不是我想要的......综合功能在那里有一些用户特定的信息。让我知道这是否有意义....
    • 假设你有某种 session ID,你可以为每个 session 创建一个新的 debouncer(记得在 session 结束时清理它),然后使用 session ID 作为 key 来存储每个 debouncer在对象或地图中,然后在每次 API 调用时按 ID 查找去抖动器。
    猜你喜欢
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-16
    相关资源
    最近更新 更多