检查xstate机器定义中的cond语句

时间:2019-10-07 18:43:27

标签: node.js xstate

我有以下代码,处于start状态的情况给我带来了麻烦。

const machine = require('xstate');
let test = true;

// Stateless machine definition
// machine.transition(...) is a pure function used by the interpreter.
const helloMachine = machine.Machine({
    id: 'hello',
    initial: 'start',
    states: {
        start: {
            on: {
                STOP: {
                    target: 'stop',
                    actions: ['hi'],

                    // ! something is wrong with cond structure
                    cond: () => test === false // returns either true or false, which signifies whether the transition should be allowed to take place
                }
            }
        },
        stop: {
            entry: ['hello'], // The action(s) to be executed upon entering the state node.
            type: 'final'
        }
    }
}, {
    actions: {
        hello: (context, event) => {
            const hello = 'Hello World';
            console.log(hello)
        },

        hi: () => {
            test = false;
            console.log(`${test} -> ${typeof(test)}`);
        }
    }
})

// Machine instance with internal state
const helloService = machine.interpret(helloMachine)

helloService.start();
helloService.send('STOP');

如我所见,如果test为假,则应该进入下一个状态。最初是test = true,在hi操作中,我切换为false,然后检查条件,如果cond: () => test === false下一个状态没有运行,但是如果cond: () => test === true它运行了

代码是否有错误,或者mu对cond的理解是错误的?

1 个答案:

答案 0 :(得分:0)

您对cond的理解不太正确。仅当后卫(cond表达式)通过(即求值为true)时,才会进行转换。

进行过渡意味着:

  • 过渡到target状态(如果有)
  • 执行actions(如果有)

除非已采取转移,否则不会在过渡上执行动作,并且由于防护措施阻止过渡发生,因此将不会执行设置test = false的动作。

另外,请防止外部突变(test变量位于计算机外部)。它使状态机的确定性降低,从而破坏了使用状态机的目的。