I have a Mqtt client. I need it to publish each element with 5 seconds interval and receive each in on_message
callback. But my code publishes each element with same no of times as array length.
Example -
My code
var mqtt = require('mqtt');
var client = mqtt.connect("mqtt://broker.emqx.io:1883",{clientId:"mqtt_AYA"});
var arr = [1,2,3,4];
var options={
retain:true,
qos:1};
client.on("connect",function(){
console.log("connected "+ client.connected);
})
arr.forEach(no => {
client.on('message',function(topic, message, packet){
console.log("message is "+ JSON.parse(message));
// console.log("topic is "+ topic);
});
setInterval(function(){client.publish('/topic', JSON.stringify(no), options)},5000);
client.subscribe('/topic', {qos:1});
});
Result -
connected true
message is 1
message is 1
message is 1
message is 1
message is 2
message is 2
message is 2
message is 2
message is 3
message is 3
message is 3
message is 3
message is 4
message is 4
message is 4
message is 4
[5 secs interval]
Repetition of above
But I need -
connected true
message is 1
[5 secs interval]
message is 2
[5 secs interval]
message is 3
[5 secs interval]
message is 4
[5 secs interval]
and end the client
Your set Interval and subscribe are in the forEach loop. This means you are starting 4 intervals at the same time. Since every value subscribes to every message, you get 4 subscribers. When all setIntervals publish the message at the same time all 4 subscribers show the message. Therefore getting the result you see.