Остановка предыдущих запросов на публикацию Node.js

TL; DR: Как настроить почтовый запрос, который отправляет полученные данные каждую секунду в другой источник, а затем, когда тот же самый почтовый запрос сделан, он прекращает отправку этих старых данных и снова начинает отправлять новые данные каждую секунду.

У меня есть сервер Node.js, работающий с Express. Каждый раз, когда клиент отправляет почтовый запрос на один из моих маршрутов, я каждую секунду отправляю данные (используя setInterval) в очередь Apache Kafka. Когда на мой сервер отправляется новый почтовый запрос, он создает новый экземпляр этой функции setInterval и фактически отправляет как новые данные, так и старые данные каждую секунду.

Мне нужно, чтобы Node.js перестал отправлять старые данные в очередь и вместо этого отправил новые.

Любые идеи?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
39
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

У вас есть пара вариантов.

Прежде чем создавать новый таймер, остановите исходный объект интервального таймера. Когда вы это делаете, setInterval() возвращает объект таймера, с которым вы можете использовать clearInterval() позже. Тебе нужно это сохранить. Затем, когда вы перейдете к созданию нового интервального таймера, вы можете вызвать clearInterval() на старом таймере.

Держите один таймер постоянно включенным. Просто замените данные, которые вы отправляете. В этом случае вы просто поддерживаете работу исходного таймера и обновляете сохраненные данные, которые вы собираетесь отправлять каждый раз, когда он срабатывает. Тогда у вас никогда не получится запустить несколько таймеров.

@ stark0323 - Вот в чем дело. Покажите нам свой ФАКТИЧЕСКИЙ код, и мы сможем вам помочь. Когда вы создаете теоретические вопросы, в которых вы сначала не раскрываете реальную проблему, а затем продолжаете дополнять свой вопрос, я просто решаю, что не стоит преследовать движущуюся цель вопроса. В будущем вы должны указать свой НАСТОЯЩИЙ КОД в вопросе с самого начала, и этого не произойдет. К вашему сведению, это все еще кажется несложным. Когда у вас есть данные (когда они есть), вы можете хранить их глобально для использования setInterval().

jfriend00 30.05.2018 15:41

@ stark0323 - Если это ответ на ваш вопрос, вы можете сообщить об этом сообществу, щелкнув галочку слева от ответа.

jfriend00 30.05.2018 21:12
  1. Имейте центральное место, где вы вызываете setInterval, и сохраните результат setInterval.
  2. Используйте clearInterval, чтобы отменить все предыдущие вызовы setInterval
Ответ принят как подходящий

Вам нужно свойство, доступное из вашей логики, которое отправляет данные в Kafka. Это свойство будет служить текущим состоянием ваших данных публикации. В первый раз, когда вы получите сообщение, вы инициируете состояние и запустите setInterval (). После этого вам просто нужно обновить состояние, и функция внутри setInterval отправит обновленные данные.

Это будет выглядеть примерно так:

let postData;

router.post('/', function(req) {
  if (!postData) {
    //run your setInterval logic here
  } else if (req.body !== postData) {
    postData = req.body
  }
});

Другие вопросы по теме