SCXML

XState 与 SCXML (状态图 XML:控制抽象的状态机符号) 规范 兼容。 此页面包含有关我们的 API 与 SCXML 规范相关的详细信息。

事件(Events)

SCXML 中的事件包含与事件源相关的信息,并且具有与 XState 中的事件对象不同的架构。 在内部,为了兼容性,事件对象被转换为 SCXML 事件。

SCXML 事件包括:

  • name - 给出事件名称的字符串。 name 等价于 XState 事件的 .type 属性。
  • type - 事件类型:'platform''external''internal'
    • platform 事件由平台本身引发,例如错误事件。
    • internal 事件由 raise(...) 动作 或带有 target: '_internal'send(...) 动作 引发。
    • external 事件描述所有其他事件。
  • sendid - 触发 send(...) 动作的发送 ID。
  • origin - 一个字符串,允许此事件的接收者send(...) 一个响应事件回源。
  • origintype - 与 origin 一起使用
  • invokeid - 触发子服务的调用的调用 ID。
  • data - 发送实体选择包含在此事件中的任何数据。 data 相当于一个 XState 事件对象。

所有 XState 事件的 SCXML 事件形式存在于 动作 和 守卫 元对象的 _event 属性中,作为第三个参数:

```js {4-5,9-10} // … { actions: { someAction: (context, event, { _event }) => { console.log(_event); // SCXML event }; }, guards: { someGuard: (context, event, { _event }) => { console.log(_event); // SCXML event } } } // ..

  1. ## 转换(Transitions)
  2. 在状态节点的 `on: { ... }` 属性上定义的事件-目标映射与 SCXML `<transition>` 元素同义:
  3. ```js
  4. {
  5. green: {
  6. on: {
  7. TIMER: {
  8. target: '#yellow',
  9. cond: context => context.timeElapsed > 5000
  10. },
  11. POWER_OUTAGE: { target: '#red.flashing' }
  12. }
  13. },
  14. // ...
  15. }
  1. <state id="green">
  2. <transition
  3. event="TIMER"
  4. target="yellow"
  5. cond="timeElapsed > 5000"
  6. />
  7. <transition
  8. event="POWER_OUTAGE"
  9. target="red.flashing"
  10. />
  11. </state>

守卫(Guards)

cond 属性等效于 SCXML <transition> 元素上的 cond 属性:

  1. {
  2. on: {
  3. e: {
  4. target: 'foo',
  5. cond: context => context.x === 1
  6. }
  7. }
  8. }
  1. <transition event="e" cond="x == 1" target="foo" />

类似地,in 属性等价于 In() 谓词:

  1. {
  2. on: {
  3. e: {
  4. target: 'cooking',
  5. in: '#closed'
  6. }
  7. }
  8. }
  1. <transition cond="In('closed')" target="cooking"/>

状态 ID

ID 对应于 SCXML 规范中 ID 的定义:

  1. {
  2. green: {
  3. id: 'lightGreen';
  4. }
  5. }
  1. <state id="lightGreen">
  2. <!-- ... -->
  3. </state>

动作(Actions)

转换中的可执行 action 等效于 SCXML <script> 元素。 entryexit 属性分别等效于 <onentry><onexit> 元素。

  1. {
  2. start: {
  3. entry: 'showStartScreen',
  4. exit: 'logScreenChange',
  5. on: {
  6. STOP: {
  7. target: 'stop',
  8. actions: ['logStop', 'stopEverything']
  9. }
  10. }
  11. }
  12. }
  1. <state id="start">
  2. <onentry>
  3. <script>showStartScreen();</script>
  4. </onentry>
  5. <onexit>
  6. <script>logScreenChange();</script>
  7. </onexit>
  8. <transition event="STOP" target="stop">
  9. <script>logStop();</script>
  10. <script>stopEverything();</script>
  11. </transition>
  12. </state>

调用(Invoke)

invoke 属性与 SCXML <invoke> 元素同义:

  1. // XState
  2. {
  3. loading: {
  4. invoke: {
  5. src: 'someSource',
  6. id: 'someID',
  7. autoForward: true, // 目前仅适用于状态机!
  8. onDone: 'success',
  9. onError: 'failure'
  10. }
  11. }
  12. }
  1. <!-- SCXML -->
  2. <state id="loading">
  3. <invoke id="someID" src="someSource" autoforward />
  4. <transition event="done.invoke.someID" target="success" />
  5. <transition event="error.platform" cond="_event.src === 'someID'" target="failure" />
  6. </state>