Как выполнить функцию только один раз каждые X миллисекунд? - PullRequest
0 голосов
/ 15 октября 2018

Я довольно новичок в javascript и node, в настоящее время работаю в приложении node.js, приложение использует express и mongoDB, идея состоит в том, чтобы прослушивать некоторые сторонние сервисы через webhook, websocket и mqtt и сохранять все данные в mongoDB.

но у меня небольшая проблема, некоторые сторонние приложения посылают мне данные слишком часто, например, поток mqtt отправляет около 2 сообщений каждую секунду, мне нужно хранить только одно из этих сообщений каждую минуту.

это то, как я встраиваю mqtt в app.js

var mqttHandler = require('./mqtt/mqtt_handler'); //mqtt
var mqttClient = new mqttHandler(); //mqtt
mqttClient.connect(); //mqtt

, это мой mqttHandler.js:

onst mqtt = require('mqtt');

class MqttHandler {
  constructor() {
    this.mqttClient = null;
    this.host = 'mqtts://host';
    this.username = 'foo'; // mqtt credentials if these are needed to connect
    this.password = 'mypassqword';
    this.port = 8083;
    this.protocol = 'MQTTS';
    this.client = 'bar'
  }

  connect() {
    // Connect mqtt with credentials (in case of needed, otherwise we can omit 2nd param)
    this.mqttClient = mqtt.connect(this.host, {password : this.password, username : this.username, port: this.port});

    // Mqtt error calback
    this.mqttClient.on('error', (err) => {
      console.log(err);
      this.mqttClient.end();
    });

    // Connection callback
    this.mqttClient.on('connect', () => {
      //console.log(`mqtt client connected`);
    });

    // mqtt subscriptions
    this.mqttClient.subscribe('/the_subscription');
    // When a message arrives, console.log it
    this.mqttClient.on('message', function (topic, message) {
      console.log(message.toString())
    });

    this.mqttClient.on('close', () => {
      //console.log(`mqtt client disconnected`);
    });
  }

  // Sends a mqtt message to topic: mytopic
  sendMessage(message) {
    this.mqttClient.publish('mytopic', message);
  }
}

module.exports = MqttHandler;

Я читал о setInterval и setTimeout,но я не могу понять, как реализовать их, чтобы заставить данную функцию запускаться только один раз каждые X секунд (независимо от того, сколько раз она вызывается)

мог бы быть подобный / общий способ реализовать этофункция для обоих, mqtt, webohooks и / или websocket?

Я взял этот пример о том, как реализовать mqtt из учебника, он отлично работает, как я уже сказал, im prettТы новичок в JavaScript.

1 Ответ

0 голосов
/ 15 октября 2018

Один наивный подход с использованием setInterval состоит в том, чтобы регулярно устанавливать флаг и очищать его после публикации сообщения.Игнорируйте любые другие сообщения, пока флаг не будет снова установлен функцией интервалов.

let readyToPost = false;
setInterval(function(){ readyToPost = true; }, 1000);

В вашей функции:

function connect() {
  if (!readyToPost) return;  // do nothing
  readyToPost = false;
  // rest of your code
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...