0

Я использую государственную машину Stately.js для Node.jsПочему эта простая функция не работает на этом объекте в этом автозагрузке javascript?

https://github.com/fschaefer/Stately.js/

Я начинаю с простым примером.

var fsm = Stately.machine({ 
    'START': { 
     // event: function() { 
     // } 
    }, 
    'NEXT_STATE': { 
     // event: function() { 
     // } 
    }, 
}); 

fsm.setMachineState(fsm.NEXT_STATE); 

Я получаю ошибку TypeError: fsm.setMachineState is not a function. Что может быть неправильным?

+0

Вы подтвердили, что Stately.js загружен правильно? – Lewis

+0

Да. Когда я запускаю 'fsm.getMachineState()', он работает. – user781486

+3

Следуйте за документами. Вы можете вызывать 'setMachineState' только по ссылке this this внутри действия, следуя их примеру. – antishok

ответ

2

Вы не можете изменить состояние из-за пределов конечного автомата. Вам нужно, чтобы события в текущем состоянии изменились на другое состояние.

+0

Это, кажется, ограничение государственной машины. Я использовал другие государственные машины, которые позволяют мне это делать. Благодарю. Upvoted. – user781486

+3

Я считаю, что это лучшая реализация, потому что вы не можете переключиться на другую форму состояния «вне машины». Посмотрите на это так: у вас есть DVD-плеер, и вы можете поместить его в состояние паузы, пока он не включен, нет загруженного диска и нет ничего. –

1

Я нашел Hacky решение, что позволяют изменять состояние за пределами this ссылки в государственной машине, в случае, если вы не хотите, чтобы изменить FSM библиотеку.

Вместо нормального состояния перехода, вы можете определить, у вас есть функция

, добавив эту функцию для каждого состояния

'setState': function(stateName){ 
    return this[stateName] 
} 

теперь ваше состояние будет выглядеть, как это и теперь можно установить состояние с внешней стороны государственный автомат

var fsm = Stately.machine({ 
    'START': { 
     'do_something': /* => */ 'NEXT_STATE', 
     'setState': function(stateName){ 
      return this[stateName] 
     } 
    }, 
    'NEXT_STATE': { 
     'setState': function(stateName){ 
      return this[stateName] 
     } 
    }, 
}); 

fsm.setState('YOUR_STATE_NAME'); 

 Смежные вопросы

  • Нет связанных вопросов^_^