Javascript 如何仅每X毫秒执行一次函数?

Javascript 如何仅每X毫秒执行一次函数?,javascript,node.js,express,timeout,mqtt,Javascript,Node.js,Express,Timeout,Mqtt,我是javascript和node的新手,目前正在开发node.js应用程序, 该应用程序使用express和mongoDB,其想法是通过webhook、websocket和mqtt收听一些第三方服务,并将所有数据存储到mongoDB中 但我有一个小问题,一些第三方应用程序经常向我发送数据, 例如,mqtt流每秒发送大约2条消息,我每分钟只需要存储其中一条消息 这是我将mqtt实例导入app.js的方式 var mqttHandler = require('./mqtt/mqtt_handler

我是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的例子,它工作得很好,正如我所说,我是javascript新手。

使用setInterval的一个简单方法是定期设置一个标志,并在发布消息后清除它。将忽略任何其他消息,直到间隔函数再次设置该标志

let readyToPost = false;
setInterval(function(){ readyToPost = true; }, 1000);
在你的职能中:

function connect() {
  if (!readyToPost) return;  // do nothing
  readyToPost = false;
  // rest of your code
}

还有一个模块mqtt的包装器:

const mqttNow=require('mqtt-now');
常量选项={
主机:“localhost”,
间隔时间:1000,
行动:[
{
主题:"公众",,
留言:“我的留言”
},
{
主题:"随机",,
消息:()=>('random'+Math.random())
}
]
}
mqttNow.publish(选项);

看看几种节流机制中的任何一种。用这种方法试过,效果很好!请注意,在与我的搭档交谈后,我们决定使用计数器而不是超时,但这两种方法都很有效!(我们两个都试过了)