跳到主要内容

流程接口及数据传递

为什么使用接口?

  • 流程建模时合理利用数据接口能实现解耦,使逻辑更清,就像编程时定义带有形参的函数或方法,能提高搭建和阅读模型的效率
  • 调用者只需定义好传入数据的格式,调用者只需要按要求传入正确格式的数据,双方建模都无需关心对方逻辑

如何为流程设置接口?

  • 创建接口

    在流程中放置数据组件组件成为局部对象,并设置其类型为接口,操作细节详见数据组件章节

  • 外观样式

    设置接口后,所在流程边框外部和调用对象(调用组件或请求调用组件)外部会出现相应端口,用于传递数据

    ProcessInterfacesandDataPassing_image1.png

    提示

    可能你想明显区分不同端口的样式,你可以(在数据对象的样式控制条中)设置该接口数据对象的颜色,则对应的端口会保持相同颜色。

  • 数据类型

    接口决定了传递数据的类型,从端口传入的数据类型必须一致

提示:接口和端口的联系和区别
  • 接口在流程内,是局部数据对象的一种形式,供流程内部读写使用。
  • 端口附着在流程或其(请求调用对象外,并一一对应流程内的每个接口,显然用于外部连接传递数据。

接口有几种?

  • 两种

    变量接口和容器接口,前者只能传递变量,后者只能传递容器

    提示

    因为接口是拖入数据组件到流程单元内创建的,所以显然接口类型对应数据组件的类型:变量和容器

  • 变量端口有"V"字样,容器端口有"R"字样

    ProcessInterfacesandDataPassing_image2.png

流程内如何使用接口?

  • 从接口读取数据

    流程中的任意表达式中直接使用接口名字即可,如"some_variable = interface_name * 2"

  • 输出数据到接口

    流程中的任意计算公式中,等号左边使用接口名时,表达将等号右边的表达式计算结果赋值到接口对象上,如 "interface_name = some_expression"

  • 对接口进行资源操作

    使用容器操作链连接容器接口和资源操作对象

模型案例:Web3代币交换

Go流程调用了to Trade被动流程,对WalletAPool容器以ExchangeRate进行$USDC和$ETH代币的交换

  • to Trade流程设置了ExchangeRate变量接口和WalletIn资源接口,所以在Go流程中Ask对象传递了对应的变量和资源到相应端口

如何传递数据到端口?

为端口传递数据有两种方式

状态链传入数据对象

用状态链连接相同数据格式的数据对象或其引用到端口即可,表示将传入数据对象本身

ProcessInterfacesandDataPassing_image3.png

模型案例:状态链传递数据对象
  • 灰色被动流程Plus10负责将OutNum接口赋值为InNum接口+10
  • 绿色流程传入了名为Number初值为0的变量到InNum端口,名为Output的变量传递到OutNum端口
  • 最终运行结果变量 OutPut=10
提示

状态链传入数据对象与读取还是写入无关,这仅仅取决于你在流程内如何使用。

以上模型中,Number变量传入Plus10流程后,在计算组件中仅仅读取了它的值,可以理解为"读取";而OutPut变量传入后,计算组件进行了结果赋值,可以理解为"写入",所以最终OutPut变量可以看到调用后的计算结果。

传入值

  • 为端口传入表达式的取值

  • 在端口所属对象属性面板的参数传入输入框中填写表达式

    ProcessInterfacesandDataPassing_image4.png

  • 该输入框接受能够返回接口要求Number格式的表达式

模型案例:直接传入取值
  • 灰色被动流程Plus10将OutNum接口赋值为InNum接口+10
  • 蓝色流程传入表达式"Number"运算的值到InNum端口,并在Call组件的动作后计算给出了公式 OutPut = This.OutNumOutNum端口的值赋给变量OutPut
  • 最终运行结果 变量Output值为10

两种方式的区别

  • 性质不同,效果不同

    • 状态链对象传入:传入的是对象本身,被调用流程内任意位置计算修改接口都针对对象本身

    • 取值传入传入的是值,具体说是在流程被触发时表达式的取值,并赋予接口对象。类似于Python给函数形参传值。被调用流程内任意位置计算修改接口仅针对接口对象。

进阶提示

需要传递的变量名为V,以上述状态链和取值两种方式传递数据时

  • 如果V的格式为简单类型,那么在被调用流程内多处读取接口时,前者获得V的实时最新值,后者获得是流程刚被调用时V的值;写入该接口时,前者会写入V,后者不会
  • 如果V的格式为Dict或Set复杂变量,那么在被调用流程内多处读取接口时,二者都会获得最新值,修改接口时二者都会改写V。但覆盖接口时,前者会覆盖V,后者不会
  • 这是由复杂数据类型本身的特点与简单类型不同造成的
  • 系统优先识别状态链对象传入方式

  • 对容器端口,只能采用状态链连接容器对象的传入方式

模型案例:两种传入方式的区别

一个初值为0的变量InputNumber,将在第2Tick被紫色流程改为10

灰色流程被调用时将推迟2Tick后将NumberIn+10,传给NumberOut接口

在第1Tick,下方的黄色、蓝色流程都会调用灰色To Be Called流程。

黄色流程传入InputNumber变量本身,因此只要在Tick2之后,To Be Call的流程会得到其最新状态值10,所以+10后输出结果Output1值为20

蓝色流程在Tick1传入InputNumber取值0,因此在调用结束后,输出结果Output2值为10

注:To Be Called流程无并发限制,所以模型将在Tick3结束

如何访问端口?

建模中的表达式访问

  • 在流程的后续组件的公式栏中,可以step_name.port_name形式访问前序组件端口的值
  • 端口所在的组件可以在动作后计算的公式栏中,以This.port_name形式访问端口值
  • 由状态链连接的端口无法使用公式访问端口

可视化查看接口状态

ProcessInterfacesandDataPassing_image5.png