Клиент отправляет «истину» каждые 5 секунд. Как выполнить функцию на сервере (Node.js), если запрос не поступил в течение 10 секунд? Пожалуйста, дайте ответ в качестве примера кода

Клиент:

let time = JSON.stringify({
    timeOnSite: true,
});
setInterval(() => {
    let xhr = new XMLHttpRequest();
    xhr.open('POST', '/time');
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.send(time);
}, 5000);

Сервер:

app.post('/time', function(req, res){
  time += 5;
  console.log(time);
  res.send('ok');  
});
0
xcoder 22 Апр 2020 в 13:26

2 ответа

Лучший ответ

Хитрость для удовлетворения такого рода требований заключается в использовании тайм-аутов.

Каждый раз, когда вы получаете ваше сообщение, установите себе тайм-аут на десять секунд в будущем. Если тайм-аут уже существует, сначала очистите его.

let tenSecondTimeout
app.post('/time', function(req, res){

  if (tenSecondTimeout) clearTimeout(tenSecondTimeout)
  tenSecondTimeout = setTimeout (
    function() {
      /* here, do whatever you want when the timeout fires */
    }, 
    10000)

  time += 5
  console.log(time)
  res.send('ok')
});
0
O. Jones 22 Апр 2020 в 10:35

Вы можете создать Timer class, чтобы помочь вам. Создайте instance один раз и update на каждом request. Вы можете передать функцию callback для выполнения временного выхода.

< Сильный > Таймер:

class Timer {
  constructor(time, cb) {
    this.time = time;
    this.cb = cb;
  }
  update() {
    clearTimeout(this.timeId);
    this.start();
  }
  start() {
    this.timeId = setTimeout(() => {
      this.cb();
    }, this.time);
  }
}

Начните с Инициирования .

const timer = new Timer(100, function print() { // Chnage time to 10000ms
    console.log(new Date());
  });
  timer.start();

Обновить / переназначить .

timer.update();
class Timer {
  constructor(time, cb) {
    this.time = time;
    this.cb = cb;
  }
  update() {
    clearTimeout(this.timeId);
    this.start();
  }
  start() {
    this.timeId = setTimeout(() => {
      this.cb();
    }, this.time);
  }
}
const delay = (t) =>
  new Promise((r) => {
    setTimeout(r, t);
  });
async function main() {
  const timer = new Timer(100, function print() { // Chnage time to 10000ms
    console.log(new Date());
  });
  timer.start();
  await delay(200)
  timer.update();
  await delay(50)
  timer.update();
  await delay(50)
}
main()
0
xdeepakv 22 Апр 2020 в 11:00