端口与连线
理解端口,就是理解一个节点何时执行。本页是该模型的参考。
三个隐式端口
Section titled “三个隐式端口”每个节点都有它们,而它们并不出现在节点配置中:
| 端口 | 方向 | 流类型 | 作用 |
|---|---|---|---|
in | 输入 | 信号 | 触发器。接受多条入线 |
error | 输出 | 值 + 信号 | 失败路径 |
done | 输出 | 信号 | 在节点及其下游整个子图都完成后发出 |
有三个节点没有 error 端口:输出、现在和 Retry(后者本身就是一道错误边界)。
有两个没有 done:输出和 Throw。
| 流类型 | 心理符号 | 行为 |
|---|---|---|
| 值 | 一份数据 | 传递一个值;同时也充当触发器 |
| 信号 | 一记节拍 | 不传递任何内容,只负责触发 |
| 两者兼有 | 既传递一个值又触发 |
唯一被禁止的组合:从纯信号输出连到纯值输入。那样值里就没有任何内容可放。
any · json · number · string · boolean · duration · response ·
status · list · object。
类型标注主要是为了视觉上的方便,但有一个严格的例外:列表类型的输入
(添加到列表和从列表移除动作的 list 端口)会拒绝与列表不兼容的来源。json
和 list 彼此兼容;而一个普通的 object 则不兼容。
- 一个输入端口只接受一条连线。 正是这一点让图保持可读:一个值,一个来源。
in除外,它可以接受任意多条连线。- 一个输出可以给任意多个输入供值。
一个节点何时执行
Section titled “一个节点何时执行”三条规则,按顺序:
- 根节点先启动。 任何没有入线的节点都会在场景启动时被引燃。这里没有“开始”节点。
- 只等待已连线的输入。 当一个节点实际连接的每一个输入端口都收到了值时, 它就会执行。未连线的端口永远不会被等待。值会被记住:一个输入会保留最后收到的值。
in端口起屏障作用。 当它由多条连线供值时,它会等到全部到达,然后触发一次。 这就是该模型里“等这三个分支都完成”的做法。
例外:每收到一个事件就重放
Section titled “例外:每收到一个事件就重放”“每收到一个事件就重放”选项(节点的右键菜单)会把所有已连线的输入变成非阻塞的“或”门: 节点会在任意端口收到每一个值时重新触发。
有两种用法:逐条处理数据流,以及打破完成环路(一张自我回环的图)。
done 与值输出的对比
Section titled “done 与值输出的对比”这是实践中最有用的区分:
- 一个值输出在节点产出结果时就立即发出;
done还要等到所有消费该结果的部分都结束。
要做排序 —— “先把这些都做完,然后清理” —— 请从 done 连线。
要传递一份数据,请从值输出连线。
它们并不是一套独立的机制:它们就是带有某个角色的输出端口,而这个角色决定了它们的颜色。
| 节点 | 输出 |
|---|---|
| If | then / else |
| While、Do…While | then(循环体) |
| Assert | then(成功)/ else(失败) |
| Retry | attempt / exhausted |
| 模式校验 | valid / invalid / errors |
| Switch | 每个分支一个端口,外加 default |
| Socket.IO 连接 | 每个已声明的事件一个端口,外加 others |
一条连线可以携带一个选择器:应用于在途值的一个路径。
data.items[0].idbody['user-id']headers["content-type"]statusa.b、a[0]、a['clé'] 和 a["clé"] 这几种写法都被接受。含有 JSON 的片段会被即时解析;
匹配不到任何内容的路径会得到 undefined。
在连线的那一刻,Restorm 有时会自己推断出一个选择器,条件是来源有一份静态预览且它归结为 单个原始值。您随时可以替换或清空它。