在 NodeRed 中使用 clearInterval
Use clearInterval in NodeRed
我正在将 NodeRed 与 Home Assistant 一起使用。我有一个 webhook,我可以从触发节点红色功能节点的物理设备发送。函数节点如下所示:
var i = 1;
var myTimer = setInterval(function setSlackStatus(){
if (i < 14){
var minutesLeft = totalMinutes - [i];
msg.payload = {
"profile": {
"status_text": "Back in " + minutesLeft + " minutes",
"status_emoji": ":coffee:",
"status_expiration": 0
}
};
node.send(msg);
i++;
} else if (i == 14 ){
var minutesLeft = totalMinutes - [i];
msg.payload = {
"profile": {
"status_text": "Back in " + minutesLeft + " minute",
"status_emoji": ":coffee:",
"status_expiration": 0
}
};
node.send(msg);
i++;
} else if (i == 15){
msg.payload = {
"profile": {
"status_text": "I'll be back any second now",
"status_emoji": ":coffee:",
"status_expiration": 0
}
};
node.send(msg);
clearInterval(myTimer);
i = 1;
}
}, 60000)
msg.payload = {
"profile": {
"status_text": "Back in 15 minutes",
"status_emoji": ":coffee:",
"status_expiration": 0
}
};
if (msg.clearTimer == "true") {
msg.payload = "Clear Timer signal received.";
clearInterval(myTimer);
}
return [msg];
当我发送 webhook 时,这个函数基本上循环通过一个函数来每分钟更新一次我的 Slack 状态,直到我回来。
我现在正在寻找的是在需要时能够在中途清除该循环的能力。所以我创建了第二个 webhook,将 msg.clearTimer 设置为 "true",然后触发同一个节点。但是,当我在调试节点中收到一条消息,表明已收到清除计时器信号时,该函数将继续以 1 分钟的间隔调用,直到它在整个循环中具有 运行。
我想知道的是为什么。一旦我触发了这个循环函数,似乎就没有办法取消它了。任何建议将不胜感激。
每条消息都是独立处理的,因此当第一条消息到达函数节点时声明和使用的任何变量在第二条消息到达时将不存在(并且您无论如何都会覆盖 myTimer
值函数的开始)
如果您需要在调用过程中保留内容,那么您需要从 上下文 中存储和检索它们。可以找到有关如何在函数节点中使用上下文的文档 here。
至于手头的任务,我希望使用注入节点设置为定期触发,然后使用由上下文变量控制的开关节点而不是 运行 功能节点中的计时器来控制它.
我正在将 NodeRed 与 Home Assistant 一起使用。我有一个 webhook,我可以从触发节点红色功能节点的物理设备发送。函数节点如下所示:
var i = 1;
var myTimer = setInterval(function setSlackStatus(){
if (i < 14){
var minutesLeft = totalMinutes - [i];
msg.payload = {
"profile": {
"status_text": "Back in " + minutesLeft + " minutes",
"status_emoji": ":coffee:",
"status_expiration": 0
}
};
node.send(msg);
i++;
} else if (i == 14 ){
var minutesLeft = totalMinutes - [i];
msg.payload = {
"profile": {
"status_text": "Back in " + minutesLeft + " minute",
"status_emoji": ":coffee:",
"status_expiration": 0
}
};
node.send(msg);
i++;
} else if (i == 15){
msg.payload = {
"profile": {
"status_text": "I'll be back any second now",
"status_emoji": ":coffee:",
"status_expiration": 0
}
};
node.send(msg);
clearInterval(myTimer);
i = 1;
}
}, 60000)
msg.payload = {
"profile": {
"status_text": "Back in 15 minutes",
"status_emoji": ":coffee:",
"status_expiration": 0
}
};
if (msg.clearTimer == "true") {
msg.payload = "Clear Timer signal received.";
clearInterval(myTimer);
}
return [msg];
当我发送 webhook 时,这个函数基本上循环通过一个函数来每分钟更新一次我的 Slack 状态,直到我回来。
我现在正在寻找的是在需要时能够在中途清除该循环的能力。所以我创建了第二个 webhook,将 msg.clearTimer 设置为 "true",然后触发同一个节点。但是,当我在调试节点中收到一条消息,表明已收到清除计时器信号时,该函数将继续以 1 分钟的间隔调用,直到它在整个循环中具有 运行。
我想知道的是为什么。一旦我触发了这个循环函数,似乎就没有办法取消它了。任何建议将不胜感激。
每条消息都是独立处理的,因此当第一条消息到达函数节点时声明和使用的任何变量在第二条消息到达时将不存在(并且您无论如何都会覆盖 myTimer
值函数的开始)
如果您需要在调用过程中保留内容,那么您需要从 上下文 中存储和检索它们。可以找到有关如何在函数节点中使用上下文的文档 here。
至于手头的任务,我希望使用注入节点设置为定期触发,然后使用由上下文变量控制的开关节点而不是 运行 功能节点中的计时器来控制它.