выполнять действие после каждого другого действия в определенном c состоянии - PullRequest
0 голосов
/ 12 июля 2020

Допустим, у меня есть машина с одним состоянием, которое обеспечивает действия, увеличивающие или уменьшающие значение.

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 после выполняется какое-либо другое действие? В качестве примера я мог бы каждый раз умножать результат inc и dec.

Я понимаю, что могу просто добавить действие после inc и dec, но мне интересно, если это как-то выполнимо в одном месте.

1 Ответ

2 голосов
/ 12 июля 2020

По сути, вы хотите сделать две вещи:

  1. Выполнить действие (например, умножение) всякий раз, когда вы вводите конкретное c состояние
  2. Повторно введите это c, когда происходят некоторые события (например, 'inc' и 'dec').

Определите действие entry в состоянии 'initial' и target: 'initial' в чтобы повторно войти в это состояние (даже если вы уже в этом состоянии):

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;
            }
          })
        }
      }
    }
  }
});
...