请求完成后进行防抖

时间:2019-09-26 15:04:08

标签: node.js debounce

我想创建一个简单的debounce函数,该函数将在给定的Node.js请求生命周期结束后发生。

让我们拥有这个简单的Node / Express应用程序:

const debounce = require('debounce')
const express = require('express')
const app = express()
const port = 4000

global.i = 0;

app.get('/test', (req, res) => {
    debounce(() => { global.i++; }, 3000, false);
    res.send(global.i.toString());
});

app.listen(port, () => console.log(`Listening on port ${port}`));

每当我打电话给http://localhost:4000/时,都会得到i作为响应。

我希望只要在3秒间隔内调用此端点,去抖动功能回调就不会启动,并且i将为0;当我等待3秒以上时,它将运行,并且下次调用端点时,我将获得一个更新的值(例如1)。

但这不会发生。响应结束,并且代码“死”-从未触发debounce函数回调。

即使在请求/响应周期结束后,什么仍能使事情在后台继续运行?

2 个答案:

答案 0 :(得分:1)

我不确定。这是否是正确的方法。但是您可以使用时间戳创建防抖动。参见下面的示例

const express = require("express");
const app = express();
const port = 4444;
global.serverInfo = {
  lastUpdate: null,
  count: 0
};

app.get("/test", (req, res) => {
  updateValue();
  res.send(global.serverInfo.count.toString());
});
const updateValue = () => {
  if (global.serverInfo.lastUpdate) clearTimeout(global.serverInfo.lastUpdate);
  global.serverInfo.lastUpdate = setTimeout(() => {
    global.serverInfo.count = global.serverInfo.count + 1;
  }, 3000);
};
app.listen(port, () => console.log(`Listening on port ${port}`));

答案 1 :(得分:0)

可能您希望在发送类似此代码的响应后反跳

const debounce = require('debounce')
const express = require('express')
const app = express()
const port = 4000

global.i = 0;

app.get('/test', (req, res) => {
    res.once('end', debounce(() => { global.i++; }, 3000, false));
    res.send(global.i.toString());
});

app.listen(port, () => console.log(`Listening on port ${port}`));