【问题标题】:How to process data after a counter reached to zero for a specific period of time, then the counter will start again after that peiod of time?计数器在特定时间段内达到零后如何处理数据,然后计数器将在该时间段后重新启动?
【发布时间】:2021-01-21 13:49:04
【问题描述】:

我的场景是一个节点选择一个随机数作为计数器,然后开始自动递减计数器(我做了这一步)。当计数器归零时,节点仅处理 1 分钟的数据。处理1分钟后,节点会再次选择一个随机数并自动递减,然后处理数据1分钟。节点必须重复这样做。

我试过这个:

var mqtt = require('mqtt')
var Broker_URL = 'mqtt://localhost';
var client  = mqtt.connect(Broker_URL);

client.on('connect', function () {
    console.log("MQTT connected  "+ client.connected);
    client.subscribe('DAG1');
})

var MIN_PER_RANK =3;
var MAX_PER_RANK =5;

function animateValue(start, end) {
    if (start === end) return;
    var current = start;
    var increment = end > start? 1 : -1;
    var timer = setInterval(function() {
        current += increment;
        if (current == end) {
            clearInterval(timer);
        }
            console.log (current);
        if (current === 0){
            console.log("finish counter")
            console.log("process data for 1 minute")

            client.on('message', function (topic, message) {
                processdata(topic, message)
            })   
        }

    }, 1000);
}

var randomvalue = Math.floor(Math.random() * (MAX_PER_RANK - MIN_PER_RANK  + 1) + MIN_PER_RANK);
animateValue(randomvalue, 0);

var start = true;
setInterval(function(){
    if(start){
        start = false;
    } else {
        start = true;
        console.log("start counter")
            
        var randomvalue = Math.floor(Math.random() * (MAX_PER_RANK - MIN_PER_RANK  + 1) + MIN_PER_RANK);
        animateValue(randomvalue, 0);
    }
}, 60000); //1 minute

function processdata(top, param) { 
    if (start){
        console.log(param.toString())
    }
} 

代码是这样运行的: 节点选择一个随机数作为计数器,开始自动递减计数器。当节点达到零时,它处理数据 1 分钟。然后,节点将再休眠 1 分钟。之后,节点将唤醒并再次启动该过程。 如何让节点在处理 1 分钟后立即启动计数器而不是进入睡眠状态? 我怎么能解决它? 提前感谢

输出:

MQTT connected  true
4
3
2
1
0
finish counter
process data for 1 minute
{"sensorvalue":"91","timestamp":1611236199874,"topicsensor":"sensor1","dataID":"0a9e9f87-51b4-4a37-91d5-773de6869491"}
{"sensorvalue":"99","timestamp":1611236214889,"topicsensor":"sensor1","dataID":"109bbf17-78b8-4357-90ac-ca23f760a4eb"}

start counter
3
2
1
0
finish counter
process data for 1 minute
{"sensorvalue":"80","timestamp":1611236219894,"topicsensor":"sensor1","dataID":"71398516-3757-4a0b-ad61-20e9a17891cc"}
{"sensorvalue":"80","timestamp":1611236219894,"topicsensor":"sensor1","dataID":"71398516-3757-4a0b-ad61-20e9a17891cc"}

【问题讨论】:

    标签: javascript node.js time counter period


    【解决方案1】:

    可以是你想要的。

    var mqtt = require('mqtt')
    var Broker_URL = 'mqtt://localhost';
    var client = mqtt.connect(Broker_URL);
    
    client.on('connect', function () {
      console.log("MQTT connected  " + client.connected);
      client.subscribe('DAG1');
    })
    
    var MIN_PER_RANK = 3;
    var MAX_PER_RANK = 5;
    
    function animateValue(start, end) {
      if (start === end) return;
      var current = start;
      var increment = end > start ? 1 : -1;
    
      var timer = setInterval(function () {
        current += increment;
        console.log(current);
        if (current == end) {
          clearInterval(timer);
        }
    
        if (current === 0) {
          console.log("finish counter")
          console.log("process data for 1 minute")
          client.on('message', function (topic, message) {
            processdata(topic, message)
          })
        }
    
      }, 1000);
    }
    
    function processdata(top, param) {
      console.log(param.toString())
      // ... do what do you want
      animateValue(randomValue(), 0); // After all code inside processData() restart the function animateValue()
    }
    
    function randomValue() { // Generate a random number
      return Math.floor(Math.random() * (MAX_PER_RANK - MIN_PER_RANK + 1) + MIN_PER_RANK);
    }
    
    animateValue(randomValue(), 0); // All start from here
    

    我使用了回调和递归函数。

    【讨论】:

    • 谢谢!但不幸的是,它并没有像我真正想要的那样工作。它只是保持自动递减计数器并同时处理。
    • 我不确定我是否理解,您希望在processdata 之后重新开始倒计时?我试图更正上面注释中的代码,我删除了setInterval,将回调移动到processdata 中,并创建了一个获取随机数的函数。现在脚本立即启动并在processdata 结束时重新开始倒计时。
    猜你喜欢
    • 2015-03-08
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    相关资源
    最近更新 更多