在特定条件下停止并重新启动 Node js 中的循环函数



我使用request npm从API获取数据。在响应中我得到一个对象{计数 : 1}

如果此值为 0,则我通过节点邮件程序发送电子邮件。

因此,它每 3 秒发送电子邮件一次,但如果值仍然为 0,我想在 600 秒后发送下一封电子邮件。

如何在不停止 3 秒循环的情况下实现这一目标。

这是我的代码

var request = require("request");
function getreq1() {
  request.get('https://api.xxxx.com/xxxxx/xxxxx', {
    oauth: {
        //some code here
    },
    qs: {
        //some code here
    }
  }, function (err, res, body) {
    if (err) throw new Error(err);
    var value = (JSON.parse(body).property['xxxxx'].prop);
    if (value === 0){
        console.log("Sending Alert email");
        sendmail();
    } else{
        console.log("All is well");
    }
  });
};
function init(timer) {
  getreq1();
  setTimeout(function () {
    init(timer)
  }, timer);
}
init(3000);

我希望 getreq(( 每 3 秒运行一次,但如果值===0,发送电子邮件后发送电子邮件的函数不应该在 600 秒内发送电子邮件,如果值仍然是 0

一个简单的方法是有一个全局变量,考虑到您总是get来自同一个 url。 600 秒除以 3 秒等于 200,因此您可以使用模(余数(运算符 %

var request = require("request");
var timerSum = 0;
function getreq1() {
  request.get('https://api.xxxx.com/xxxxx/xxxxx', {
    oauth: {
        //some code here
    },
    qs: {
        //some code here
    }
  }, function (err, res, body) {
    if (err) throw new Error(err);
    var value = (JSON.parse(body).property['xxxxx'].prop);
    //use Modulus (Remainder), on 0, 200, 400, 600, timerSum%200 === 0 is true
    if (value === 0){
        if(timerSum%200 === 0){
          console.log("Sending Alert email");
          sendmail();
        }
        timerSum++;
    } else if(value === 1){
        console.log("All is well");
        timerSum = 0; //reset
    }
  });
};
function init(timer) {
  getreq1();
  setTimeout(function () {
    init(timer)
  }, timer);
}
init(3000);

我没有测试,但它应该有效。给出一些反馈是否有效

听起来你想添加一个第二个条件,这个条件应该在 600 秒内只通过一次。

这可以通过存储时间戳并进行比较来实现:

let lastEmailSentAt // add a variable that will store the last timestamp at which condition was fulfilled
function getreq1() {
  // ... your code here
    if (value === 0 && (!lastEmailSentAt || Date.now() - lastEmailSent > 10 * 60 * 1000)) { // 600 sec
      console.log("Sending Alert email");
      sendmail();
      lastEmailSentAt = Date.now();
    } else {
      console.log("All is well");
    }
 // ... your code here
};

或者通过设置布尔变量:

let canSendEmail = true
function getreq1() {
  // ... your code here
    if (value === 0 && canSendEmail) {
      console.log("Sending Alert email");
      sendmail();
      canSendEmail = false;
      setTimeout(function () { canSendEmail = true; }, 10 * 60 * 1000); // 600 sec
    } else {
      console.log("All is well");
    }
 // ... your code here
};

最新更新