NodeRed基础1--循环结构

创建循环是常见的编程技术。node-red-contrib-loop 节点在 Node-RED 中为它们提供支持。

节点名:  node-red-contrib-loop

node-red-contrib-loop

您可以在三种循环之间进行选择。具有固定重复计数的循环,基于评估条件的循环或迭代可迭代枚举的循环。

常见描述

您可以通过发送msg.command到输入来控制循环。如果它包含一个break字符串,则循环将立即结束。如果它包含一个restart字符串,则循环将从第一个值重新开始。

该节点有两个输出:循环结束和循环步骤。当循环离开时,第一个输出在最后使用。通过循环处理节点将第二个输出连接到输入,即创建循环。

 连接到循环输出步骤msg.loop的处理循环中的节点将获得具有以下属性的对象:

  • index- 计数器从 0 加 1

它可能包含更多属性,但它们取决于循环的类型。请参阅下面的每个循环类型部分。您可以选择要放置到的属性之一msg.payload。为此,请使用编辑器表单中的Loop Payload属性。

循环输出结束时,您将获得msg.loop具有以下属性的对象:

  • broken- 如果循环已收到break命令,则为 true
  • timeout- 如果超时已过期,则为 true
  • passed.total- 通过循环的总次数,包括所有重新启动
  • passed.last- 从上次重新启动或开始通过循环的次数
  • restarts- 循环重新启动的次数

您还将获得msg.payload循环输出结束。它应该包含哪个值是可选的。您可以在循环中的最后一个有效负载和节点在开始时在输入上接收的原始有效负载之间进行选择。使用编辑器表单中的End Payload进行选择。

您可以限制所有三种循环的时间。在编辑器表单中或即时使用时间限制msg.limit。时间以毫秒为单位指定。

“固定计数”循环种类

当您希望使用数字计数器进行固定次数的重复时,请使用此循环类型。

Count字段指定通过循环的次数。您可以省略它并msg.count即时使用。

Initial Value字段指定计数器应从哪个值开始计数。您可以省略它并msg.initial即时使用。

步长值字段指定计数器的步长增量或减量。

连接到循环输出步骤的处理分支中的节点将获得msg.loop具有以下附加属性的对象:

  • value- 计数器值
  • count- 请求通过循环的次数
  • initial- 计数器开始的值
  • step- 用于递增或递减计数器的值

“条件”循环类型

当您需要基于某些条件的循环时,请使用此循环类型。

您需要在条件字段中定义条件。您可以从三种语言中进行选择。

  • JavaScript - 用 Ja​​vaScript 语言编写为代码的条件。条件评估将使用最后一部分的结果。如果是 则循环将继续true,否则循环将结束。示例:
      msg.payload !== "done"
      roses = global.get("roses"); global.set("roses", ++roses); roses <= 100
    JavaScript 代码在沙箱中执行,具有类似于功能节点的有限环境。

  • JSONata - 作为JSONata表达式的条件。如果表达式被评估为 ,则循环将继续true,否则循环将结束。例子:
      msg.payload in [1,2,3,5,7,13,21]
      $globalContext("status") or msg.size > 10

  • 正则表达式- 与 test() 函数一起使用的正则表达式应用于msg.payload. 如果匹配,则循环将继续,否则循环将结束。例子:
      file[0-9].txt
      ^[a-zA-Z0-9]+: .*

接下来的三个示例以不同的速度在不同的语言中执行相同的工作(测试字符串是否以“Z”字符结尾):

  msg.payload.substr(-1) != "Z"
  $substring(msg.payload, -1) != "Z"
  .*[^Z]

在这种情况下,JavaScript 是最快的,而 Regex 是最慢的。但是,对于更复杂的表达式,这可能会有所不同。用这些语言中的每一种都不是很容易或不可能写出来的。例如,Regex 仅用于比较字符串,但它也是复杂搜索模式的最佳选择。

您可以选择是否应在循环之前之后评估条件。不同之处在于在第一种情况下评估初始值的条件。与经典编程相比,第一个选项是“while‥do”循环,第二个选项是“do‥while”/“repeat‥until”循环。

msg.loop没有此循环类型的其他属性。

“枚举”循环种类

当你想迭代一些枚举时使用这种循环类型。它必须是可迭代的,分别是:Array、Typed Array、Object、Map、Set 和 String。

您需要将枚举字段中的枚举指定为消息、流或全局上下文的属性。您也可以直接将其指定为 JSON 或普通字符串。

连接到循环输出步骤的处理分支中的节点将获得一个msg.loop具有以下附加属性的对象:

  • value- 迭代项目值
  • key- 迭代项键;仅用于一般对象和地图
  • enumeration- 它迭代的对象

实例:循环输出2到10数字

 

 

输出:

 源码:

[
    {
        "id": "f6f2187d.f17ca8",
        "type": "tab",
        "label": "Flow 1",
        "disabled": false,
        "info": ""
    },
    {
        "id": "a0d982d71f964d84",
        "type": "inject",
        "z": "f6f2187d.f17ca8",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 330,
        "y": 480,
        "wires": [
            [
                "90c556d22c878a58"
            ]
        ]
    },
    {
        "id": "28ce84984ae809bf",
        "type": "debug",
        "z": "f6f2187d.f17ca8",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 790,
        "y": 580,
        "wires": []
    },
    {
        "id": "90c556d22c878a58",
        "type": "loop",
        "z": "f6f2187d.f17ca8",
        "name": "",
        "kind": "fcnt",
        "count": "10",
        "initial": "1",
        "step": "1",
        "condition": "",
        "conditionType": "js",
        "when": "before",
        "enumeration": "enum",
        "enumerationType": "msg",
        "limit": "10",
        "loopPayload": "loop-val",
        "finalPayload": "final-last",
        "x": 550,
        "y": 480,
        "wires": [
            [],
            [
                "c99878db6c70d523"
            ]
        ]
    },
    {
        "id": "c99878db6c70d523",
        "type": "function",
        "z": "f6f2187d.f17ca8",
        "name": "",
        "func": "var m=msg.payload+1;\nmsg.payload=m;\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 550,
        "y": 580,
        "wires": [
            [
                "90c556d22c878a58",
                "28ce84984ae809bf"
            ]
        ]
    }
]

 从1到100累加

先设置全局变量

 

 流图

 

var myVar = global.get('myVariable');
var m=msg.payload;
myVar =myVar+m;
global.set('myVariable', myVar);
msg.payload = myVar;
return msg;

 运行结果

 源码

[
    {
        "id": "c0a7772885e3e7bf",
        "type": "tab",
        "label": "Flow 1",
        "disabled": false,
        "info": ""
    },
    {
        "id": "1e80c1c96176c228",
        "type": "inject",
        "z": "c0a7772885e3e7bf",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 330,
        "y": 480,
        "wires": [
            [
                "e69ba2b74eadcb6a"
            ]
        ]
    },
    {
        "id": "fdaa8967d60582c7",
        "type": "debug",
        "z": "c0a7772885e3e7bf",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 790,
        "y": 580,
        "wires": []
    },
    {
        "id": "e69ba2b74eadcb6a",
        "type": "loop",
        "z": "c0a7772885e3e7bf",
        "name": "",
        "kind": "fcnt",
        "count": "100",
        "initial": "1",
        "step": "1",
        "condition": "",
        "conditionType": "js",
        "when": "before",
        "enumeration": "enum",
        "enumerationType": "msg",
        "limit": "100",
        "loopPayload": "loop-val",
        "finalPayload": "final-last",
        "x": 550,
        "y": 480,
        "wires": [
            [
                "16973fed0cb0e0e1"
            ],
            [
                "6d52c07289061fb5"
            ]
        ]
    },
    {
        "id": "6d52c07289061fb5",
        "type": "function",
        "z": "c0a7772885e3e7bf",
        "name": "累加",
        "func": "var myVar = global.get('myVariable');\nvar m=msg.payload;\nmyVar =myVar+m;\nglobal.set('myVariable', myVar);\nmsg.payload = myVar;\nreturn msg;",
        "outputs": 1,
        "timeout": "",
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 550,
        "y": 580,
        "wires": [
            [
                "e69ba2b74eadcb6a",
                "fdaa8967d60582c7"
            ]
        ]
    },
    {
        "id": "16973fed0cb0e0e1",
        "type": "function",
        "z": "c0a7772885e3e7bf",
        "name": "全局变量清零",
        "func": "global.set('myVariable', 0);\nreturn msg;",
        "outputs": 1,
        "timeout": 0,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 780,
        "y": 480,
        "wires": [
            []
        ]
    }
]

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

armcsdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值