Skip to content

节点执行规则

以下规则适用于所有节点,各节点文档中不再重复说明,本文档与《连接规则》配套阅读。

执行流程

  • 程序运行时,执行顺序由数据依赖关系决定:节点只有在输入数据就绪后才会执行,需要先执行其数据源(上游)节点,再执行自身。
  • 在节点编辑器中,输入端连接器位于节点左侧(从上到下排列),输出端连接器位于节点右侧(从上到下排列),因此从视觉上看数据沿「从左到右」的方向流动。
  • 一次运行中,除循环体内的节点外,其他节点只执行一次。
  • 结束节点是程序的终点,本身不执行任何操作;输入选项节点同样不执行操作,其输出直接取自选项值。

输入数据的来源

  • 未连接的输入端口使用端口上保存的默认值(常量)参与运算。
  • 已连接的输入端口使用上游节点输出的值;上游节点尚未执行时,引擎会先转去执行上游节点,待其输出就绪后再继续。
  • 连接至输入选项节点的输入端口,其值来自程序输入选项。
  • 每个输入端口同一时刻只有一条连线(由连接规则保证),因此一个输入端口只对应唯一的数据来源。

数据与流程控制信号

  • 连线分为两类:数据连接传递数值;流程控制连接(流程控制信号)决定执行顺序。
  • 节点仅在输出连接器被连接时才执行计算;多输出节点对每个输出单独计算,未连接的输出不会被计算,也不产生副作用。
  • 节点执行完成后,向已连接的输出发出结果(数据值或流程信号),后续节点随之执行。

变长节点

  • 连接器数量可增减的节点,可通过界面 +/− 按钮或 CLI elf program node connector add/delete 调整(每次增减一组连接器)。

格式驱动节点

  • 连接器数量由格式字符串中的 {} 占位符数量决定,修改格式值会自动同步参数连接器;elf program node connector set 的响应中会报告因此新增/删除的连接器。

只读连接器

  • 被标记为只读的连接器(如格式字符串输入)不可与其它连接器连接,即运行时只读。

分支

节点类型:node-type:/Flow/Branch

  • 分支节点按输入顺序依次判断「如果 / 另外如果」条件:条件为真时执行其后的控制流分支并结束判断;条件为假时跳过该分支,继续判断下一个条件。
  • 所有条件都不满足时执行最后的「否则」分支。
  • 分支所选的块执行完毕后,分支节点才继续向后执行。

循环

普通循环

节点类型:node-type:/Flow/Loop/Loop

  • 无限循环,由「间隔(毫秒)」与「循环体」组成。
  • 循环体为空(未连接循环体端口)时,循环节点直接结束,不执行任何迭代。
  • 每轮循环体执行完毕后,按「间隔(毫秒)」限速再进入下一轮,直到被「退出循环」跳出或程序停止。

计次循环

节点类型:node-type:/Flow/Loop/ForLoop

  • 由「起始索引」「循环次数」「索引变量名」「间隔(毫秒)」与「循环体」组成。
  • 索引从「起始索引」开始,共执行「循环次数」轮;循环范围为起始索引到「起始索引 + 循环次数 − 1」。
  • 起始索引大于结束索引时,循环体一次都不执行。
  • 每轮之间按「间隔(毫秒)」限速;循环体内可通过「索引变量名」读取当前循环索引。

循环的通用行为

  • 每轮迭代中产生的数据缓存在该轮结束时丢弃,各轮迭代相互独立。
  • 退出循环节点:条件为真时立即终止所在循环,程序从循环节点之后继续执行;条件为假时不影响循环。
  • 进入下一轮循环节点:条件为真时跳过本轮循环体剩余部分,直接开始下一轮;条件为假时不影响本轮。
  • 退出与继续只作用于最近的循环(嵌套循环时作用于内层循环)。

子程序调用

  • 调用程序节点用于执行另一个程序(子程序)。
  • 调用时保存当前运行环境(变量、选项、数据缓存等),并把调用节点输入端口的值作为子程序的输入选项传入。
  • 子程序执行完毕后,其输出选项值写回调用节点对应的输出端口;未产生输出值的端口使用默认值。
  • 随后恢复调用前的运行环境,继续执行调用节点之后的流程。
  • 子程序拥有独立的运行环境:子程序内定义的变量不会影响调用方。

等待与停止

  • 等待节点:暂停指定毫秒数后继续执行。
  • 等待至节点:暂停至目标时间戳(毫秒)后继续执行;若目标时间戳已过则立即继续。
  • 等待期间可被停止命令中断,中断后程序立即结束。
  • 程序运行期间会持续检查停止命令,收到后立即结束整个程序。

运行环境与作用域

  • 程序运行时的数据缓存、选项与变量按层级管理:进入子程序会创建新的层级,退出时恢复;循环迭代同样拥有独立的缓存层级。
  • 变量在子程序内具有独立作用域;循环内不另建变量作用域,循环内对变量的读写对同一次程序运行中的后续逻辑可见。