我正在尝试使用Apache实现一个控制流。我的状态转换就像
<scxml initial="State1">
<state id = "State1"><transition event="event1" target="State2"></state>
<state id = "State2">
<transition event="event2" target="State3">
<transition event="event3" target="State4">
</state>
<state id = "State3">
<transition event="event4" target="State2">
</state>
<state id = "State4">
<transition event="event5" target="State2">
</state>
<state id = "State5"><transition target="State1">
</scxml>作为一个状态机,它工作正常,没有任何问题。但我有两个要求,我面临的问题是
state2的时候,我有可能通过state3去state4或state5。在检查转到state3或state5的条件后,是否有可能触发事件或更改状态?上述两个问题似乎都有相同的解决方案,但我无法找到实现这些问题的最佳方法。
发布于 2015-05-18 22:48:00
检查外部事件…如果这个事件是真的,…进入循环的最后一个状态。
您可以通过在父包装器中包装所有状态并从其父包装器中转换来实现这一点。例如:
<scxml xmlns="http://www.w3.org/2005/07/scxml" initial="state1">
<state id='all'>
<!-- this will always be tested, no matter which child state you are in -->
<transition event="externalevent" target="state5" />
<state id="state1"><!-- ... --></state>
<state id="state2"><!-- ... --></state>
<state id="state3"><!-- ... --></state>
<state id="state4"><!-- ... --></state>
<state id="state5"><!-- ... --></state>
</state>
</scxml>当我在
state2的时候,有可能我可以通过state3__去state4或state5?
这似乎是一个不好的模式,你正在描述,但是的,这是可能的。您需要在进入状态的过程中设置一个标志,并使用该标志立即进行转换。例如,使用一个简单的Lua数据模型 ( Apache不支持,但这里使用是为了清晰起见):
<datamodel>
<data id="bounceTo" expr="-1" />
</datamodel>
<state id="state2">
<transition event="bounce-3-4" target="state3">
<assign location="bounceTo" expr="4" />
</transition>
<transition event="bounce-3-5" target="state3">
<assign location="bounceTo" expr="5" />
</transition>
</state>
<state id="state3">
<transition cond="bounceTo==4" target="state4">
<assign location="bounceTo" expr="-1" />
</transition>
<transition cond="bounceTo==5" target="state5">
<assign location="bounceTo" expr="-1" />
</transition>
</state>在Apache中设置、测试和清除数据值是我所无法理解的。
,,我必须问您为什么要这样做。在我看来,在转换本身( state3 )上复制您可能想要的进入或退出操作(),并让这些转换直接针对状态4或5,似乎要好得多。
https://stackoverflow.com/questions/30311432
复制相似问题