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
JavaScript
x
24
24
1
var mqtt = require('mqtt');
2
var client = mqtt.connect("mqtt://broker.emqx.io:1883",{clientId:"mqtt_AYA"});
3
4
var arr = [1,2,3,4];
5
var options={
6
retain:true,
7
qos:1};
8
9
client.on("connect",function(){
10
console.log("connected "+ client.connected);
11
})
12
13
arr.forEach(no => {
14
client.on('message',function(topic, message, packet){
15
console.log("message is "+ JSON.parse(message));
16
// console.log("topic is "+ topic);
17
});
18
19
setInterval(function(){client.publish('/topic', JSON.stringify(no), options)},5000);
20
21
client.subscribe('/topic', {qos:1});
22
23
});
24
Result –
JavaScript
1
20
20
1
connected true
2
message is 1
3
message is 1
4
message is 1
5
message is 1
6
message is 2
7
message is 2
8
message is 2
9
message is 2
10
message is 3
11
message is 3
12
message is 3
13
message is 3
14
message is 4
15
message is 4
16
message is 4
17
message is 4
18
[5 secs interval]
19
Repetition of above
20
But I need –
JavaScript
1
11
11
1
connected true
2
message is 1
3
[5 secs interval]
4
message is 2
5
[5 secs interval]
6
message is 3
7
[5 secs interval]
8
message is 4
9
[5 secs interval]
10
and end the client
11
Advertisement
Answer
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.