在特定状态下执行其他所有操作

时间:2020-07-12 11:14:22

标签: javascript state-machine xstate

比方说,我有一台具有单一状态的机器,该机器提供的操作会增加或减少一个值。

const Machine({
    id: 'some_machine',
    initial: 'initial',
    context: {
        value: 0
    },
    states: {
        'initial': {
            on: {
                'inc': {
                    actions: assign({
                        value: (ctx) = {
                            return ctx.value + 1
                        }    
                    })
                },
                'dec': {
                    actions: assign({
                        value: (ctx) = {
                            return ctx.value - 1
                        }    
                    })
                }
            }
        }
    }
} 

是否可以通过某种方式在initial中指定一个动作,该动作将在执行其他任何动作后映射context ?例如,我可能想每次将incdec的结果相乘。

我意识到我可以在incdec之后都添加一个动作,但是我很想知道这在单个位置是否可行。

1 个答案:

答案 0 :(得分:2)

基本上,您想做两件事:

  1. 只要进入特定状态,就执行一个操作(例如,相乘)
  2. 每当发生某些事件(例如'inc''dec')时,都要重新输入该特定状态。

'initial'状态和target: 'initial'上定义一个 entry 操作,以便重新输入该状态(即使您已经处于该状态):< / p>

Machine({
  id: "some_machine",
  initial: "initial",
  context: {
    value: 0
  },
  states: {
    initial: {
      entry: assign({
        value: ctx => ctx.value * 2
      }),
      on: {
        inc: {
          target: "initial",
          actions: assign({
            value: ctx => {
              return ctx.value + 1;
            }
          })
        },
        dec: {
          target: "initial",
          actions: assign({
            value: ctx => {
              return ctx.value - 1;
            }
          })
        }
      }
    }
  }
});