从 scxml 中的状态进行状态转换

State transition from state in scxml

我正在尝试使用 Apache scxml 实现控制流。我的状态转换就像

<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>

作为状态机,它工作正常并且没有任何问题。但是我有几个要求,我在

中遇到了问题
  1. 我必须检查每个状态中的外部事件,如果该事件为真,我必须转到循环的最后一个状态。实现这一目标的最佳方法是什么?

  2. 有可能当我在state2时,我可以通过state3state4state5。我是否可以在检查条件后触发事件或将状态从 state3 更改为 state4state5

以上两个问题似乎都有相同的解决方案,但我无法找出实现它们的最佳方法。

Check an external event […] and if that event is true […] go to the last state of the cycle.

您可以通过将所有状态包装在父包装器中并从那里转换来最优雅地完成此操作。例如:

<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>

It is possible that when I am in state2 I can go to state4 or state5 via state3?

您描述的模式似乎很糟糕,但是,是的,这是可能的。您需要在进入该状态的过程中设置一个标志,并使用该标志立即转换出状态。例如,使用简单的 Lua datamodel(Apache SCXML 不支持,但为清楚起见在此处使用):

 <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 SCXML 中的数据值超出了我的知识范围。

但是,我必须问你为什么要这样做。在我看来,从 state3 转换本身 复制您可能想要的进入或退出操作,并让这些转换直接针对状态 4 或 5.