我使用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
};