Отклонение произойдет после завершения запроса - PullRequest
0 голосов
/ 26 сентября 2019

Я хочу создать простую 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 секунды, обратный вызов функции debounce не будет срабатывать, и i будет 0;и когда я подожду более 3 секунд, он запустится, и в следующий раз, когда я вызову конечную точку, я получу обновленное значение (скажем, 1).

Но этого не происходит.Ответ заканчивается, и код «мертв» - обратный вызов функции debounce никогда не запускается.

Какой правильный способ заставить вещи продолжать работать в фоновом режиме даже после цикла запрос / ответзакончил?

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Я не уверен.Это правильный путь или нет.Но вы можете создать debounce, используя метку времени.Смотрите пример ниже

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}`));
0 голосов
/ 26 сентября 2019

Скорее всего, вы хотите отменить ответ после отправки ответа, как этот код

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}`));
...