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

按照文檔。你可以在一個動作中的'this'引用上調用'setMachineState',按照他們的例子。 – antishok

回答

2

你不能從狀態機外改變狀態。您需要將當前狀態的事件更改爲另一個狀態。

+0

這似乎是狀態機的限制。我已經使用了其他狀態機,允許我這樣做。謝謝。 Upvoted。 – user781486

+3

我相信這是一個更好的實現,因爲你無法切換到「機器外」的不同狀態。看看它是這樣的:你有一個DVD播放器,當它沒有打開時,你可以把它置於暫停狀態,沒有光盤加載,也沒有任何播放。 –

1

我已經發現了一些哈克解決方案這允許你改變的狀態機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'); 
相關問題