如何从 xstate 中的状态获取所有可能的转换

Posted

技术标签:

【中文标题】如何从 xstate 中的状态获取所有可能的转换【英文标题】:How to get all possible transitions from a state in xstate 【发布时间】:2020-03-05 12:23:48 【问题描述】:

给定一个 xState fsm,例如 counter 或 search 示例。

如何枚举可能的转换?我试过了

const current = service.state
const stateNode = service.machine
const isActive = !stateNode.parent || current.matches(stateNode.path.join('.')) || undefined
getEdges(<where do I get this node?>,  depth: 0 ).reduce((actions, edge) 

问题是我不知道将什么作为第一个参数提交给getEdges。当 fsm 刚开始时,提交stateNode 不会产生任何边。但是,xState VIZ 应用程序清楚地显示了活动状态有转换。

【问题讨论】:

【参考方案1】:

我已经玩过@xstate/graph 的部分内容,这个例子与我想要的一样接近:

import  Machine  from "xstate"

import  getShortestPaths  from '@xstate/graph'

export const feedbackMachine = Machine(
    id: 'feedback',
    initial: 'question',
    states: 
        question: 
            on: 
                CLICK_GOOD: 'thanks',
                CLICK_BAD: 'form',
                CLOSE: 'closed',
                ESC: 'closed',
                REMOVE_ME: 'nope'
            
        ,
        form: 
            on: 
                SUBMIT: 'thanks',
                CLOSE: 'closed',
                ESC: 'closed'
            
        ,
        nope: 
            on: 

            
        ,
        thanks: 
            on: 
                CLOSE: 'closed',
                ESC: 'closed'
            
        ,
        closed: 
            type: 'final'
        
    
)

const showPaths = () => 
    const paths = getShortestPaths(feedbackMachine)
    const states = Object.keys(paths).filter(k => paths[k].weight > 0)
    console.log(states)
    // [""thanks"", ""form"", ""closed"", ""nope""]


showPaths()

从问题状态的可能转换中删除 REMOVE_ME: 'nope' 后,您应该会看到结果为:[""thanks"", ""form"", ""closed""] in showPaths

我还看到 getEdges 最近已从 @xstate/graph 中删除,所以我暂时不要使用它。

【讨论】:

以上是关于如何从 xstate 中的状态获取所有可能的转换的主要内容,如果未能解决你的问题,请参考以下文章

在 xstate 中生成子机器

如何在 xstate 中重用状态转换?

如何防止 XState 节点在接收事件时重置其子并行状态?

如何使用 xstate 跟踪分析事件

状态正在改变,但 Xstate 中未触发转换

无法为 xstate 创建子状态