如何在 scxml 中定义子程序
how to define a subroutine in scxml
我正在尝试弄清楚如何在 SCXML 中对子例程进行编码。作为子例程,我的意思是可以从不同进程(状态)和 return 调用调用者的 process/routine/function。
起初我尝试使用历史状态,但在 return 上,调用者状态将重新启动,因此进入循环。这就是草图。
<scxml>
<final id="Final">
<onexit>
<transition target="ProcA" />
<transition target="ProcB" />
</onexit>
</final>
<state id="Sub">
<transition target="History" />
</state>
<state>
<history id="History" />
<final id="ProcA">
<onexit>
<transition target="Sub" />
</onexit>
</final>
<final id="ProcB">
<onexit>
<transition target="Sub" />
</onexit>
</final>
</state>
</scxml>
简短的回答是使用 SCXML 的调用标签,它允许解释器产生一个新的 SCXML 会话。 Invoke 也可以通过 type 属性进行扩展,因此如果解释器支持的话,它可以产生其他类型的子进程。 invoke 的语义要求父会话在被调用会话开始的状态下等待,直到被调用会话达到最终状态。您可以在此处查看并行调用并使用 SCXML 的发送标记相互通信的两个会话的简短示例:
https://jsbin.com/hegiyuk/edit?output
<scxml
datamodel="ecmascript"
xmlns="http://www.w3.org/2005/07/scxml"
version="1.0">
<parallel id="p">
<state id="1">
<invoke id="session_1">
<content>
<scxml
datamodel="ecmascript"
xmlns="http://www.w3.org/2005/07/scxml"
version="1.0">
<state id="session-1-foo">
<onentry>
<log label="here1"/>
<send event="ping-from-1" delay="2s" target="#_session_2"/>
</onentry>
<transition event="ping-from-2" target="session-1-bar"/>
</state>
<state id="session-1-bar">
<onentry>
<log label="here3"/>
<send event="pong-from-1" delay="2s" target="#_session_2"/>
</onentry>
<transition event="pong-from-2" target="session-1-foo"/>
</state>
</scxml>
</content>
</invoke>
</state>
<state id="2">
<invoke id="session_2">
<content>
<scxml
datamodel="ecmascript"
xmlns="http://www.w3.org/2005/07/scxml"
version="1.0">
<state id="session-2-foo">
<onentry>
<log label="here2"/>
<send event="ping-from-2" delay="2s" target="#_session_1"/>
</onentry>
<transition event="ping-from-1" target="session-2-bar"/>
</state>
<state id="session-2-bar">
<onentry>
<log label="here4"/>
<send event="pong-from-2" delay="2s" target="#_session_1"/>
</onentry>
<transition event="pong-from-1" target="session-2-foo"/>
</state>
</scxml>
</content>
</invoke>
</state>
</parallel>
</scxml>
我正在尝试弄清楚如何在 SCXML 中对子例程进行编码。作为子例程,我的意思是可以从不同进程(状态)和 return 调用调用者的 process/routine/function。
起初我尝试使用历史状态,但在 return 上,调用者状态将重新启动,因此进入循环。这就是草图。
<scxml>
<final id="Final">
<onexit>
<transition target="ProcA" />
<transition target="ProcB" />
</onexit>
</final>
<state id="Sub">
<transition target="History" />
</state>
<state>
<history id="History" />
<final id="ProcA">
<onexit>
<transition target="Sub" />
</onexit>
</final>
<final id="ProcB">
<onexit>
<transition target="Sub" />
</onexit>
</final>
</state>
</scxml>
简短的回答是使用 SCXML 的调用标签,它允许解释器产生一个新的 SCXML 会话。 Invoke 也可以通过 type 属性进行扩展,因此如果解释器支持的话,它可以产生其他类型的子进程。 invoke 的语义要求父会话在被调用会话开始的状态下等待,直到被调用会话达到最终状态。您可以在此处查看并行调用并使用 SCXML 的发送标记相互通信的两个会话的简短示例:
https://jsbin.com/hegiyuk/edit?output
<scxml
datamodel="ecmascript"
xmlns="http://www.w3.org/2005/07/scxml"
version="1.0">
<parallel id="p">
<state id="1">
<invoke id="session_1">
<content>
<scxml
datamodel="ecmascript"
xmlns="http://www.w3.org/2005/07/scxml"
version="1.0">
<state id="session-1-foo">
<onentry>
<log label="here1"/>
<send event="ping-from-1" delay="2s" target="#_session_2"/>
</onentry>
<transition event="ping-from-2" target="session-1-bar"/>
</state>
<state id="session-1-bar">
<onentry>
<log label="here3"/>
<send event="pong-from-1" delay="2s" target="#_session_2"/>
</onentry>
<transition event="pong-from-2" target="session-1-foo"/>
</state>
</scxml>
</content>
</invoke>
</state>
<state id="2">
<invoke id="session_2">
<content>
<scxml
datamodel="ecmascript"
xmlns="http://www.w3.org/2005/07/scxml"
version="1.0">
<state id="session-2-foo">
<onentry>
<log label="here2"/>
<send event="ping-from-2" delay="2s" target="#_session_1"/>
</onentry>
<transition event="ping-from-1" target="session-2-bar"/>
</state>
<state id="session-2-bar">
<onentry>
<log label="here4"/>
<send event="pong-from-2" delay="2s" target="#_session_1"/>
</onentry>
<transition event="pong-from-1" target="session-2-foo"/>
</state>
</scxml>
</content>
</invoke>
</state>
</parallel>
</scxml>