【修真院】javascript
小課堂 - 如何使用狀態機任務四如何使用狀態機?java
目錄
1.背景介紹
2.知識剖析
3.常見問題
4.解決方案
5.編碼實戰
6.擴展思考git
7.參考文獻github
8.更多討論編程
1.背景介紹服務器
1.什麼是有限狀態機?異步
有限狀態機(英語:finite-state machine,縮寫:FSM)又稱有限狀態自動機,簡稱狀態機,是表示有限個狀態以及在這些狀態之間的轉移和動做等行爲的數學模型。函數
2.知識剖析:佈局
狀態存儲關於過去的信息,就是說:它反映從系統開始到如今時刻的輸入變化。轉移指示狀態變動,而且用必須知足肯定轉移發生的條件來描述它動做在給定時刻要進行的活動的描述。有多種類型的動做:
進入動做(entry action):在進入狀態時進行
退出動做:在退出狀態時進行
輸入動做:依賴於當前狀態和輸入條件進行搜索優化
轉移動做:在進行特定轉移時進行
生成實例之後,就能夠隨時查詢當前狀態。
Javascript Finite State Machine容許爲每一個事件指定兩個回調函數,以warn事件爲例:
同時,它也容許爲每一個狀態指定兩個回調函數,以green狀態爲例:
假定warn事件使得狀態從green變爲yellow,上面四類回調函數的發生順序以下:onbeforewarn → onleavegreen → onenteryellow → onafterwarn。
除了爲每一個事件和狀態單獨指定回調函數,還能夠爲全部的事件和狀態指定通用的回調函數。
若是事件的回調函數裏面有異步操做(好比與服務器進行Ajax通訊),這時咱們可能但願等到異步操做結束,再發生狀態改變。這就要用到transition方法。
3.常見問題:
JavaScript的的狀態機建立的對象是如何知足狀態機模型的要求的:
4.解決方案:
能夠用狀態來描述事物,而且任一時刻,老是事物處於一種狀態
事物擁有的狀態總數的英文有限的
經過觸發事物的某些行爲,致使能夠從事物一種狀態過渡到另外一種狀態
事物狀態變化是有規則的,A狀態能夠變換到B,B能夠變換到C,A卻不必定能變換到ç
同一種行爲,能夠將事物從多種狀態變成同種狀態,可是不能從同種狀態變成多種狀態
5.編碼實戰
以官方文檔爲例
var fsm = new StateMachine({
init:'solid',
過渡:[
{name:'melt',from:'solid',to:'liquid'},
{name:'freeze',from:'liquid',to:'solid'},
{name:'vaporize',from:'liquid',to:'gas'},
{name:'condense',from:'gas',to:'liquid'}
]
方法: {
onMelt:function(){console.log('I melted')},
onFreeze:function(){console.log('我凍結')},
onVaporize:function(){console.log('I vaporized')},
onCondense:function(){console.log('I condensed')}
}
});
6.更多思考
怎樣決定有限狀態機的使用時機或方式
7.參考連接
https://blog.csdn.net/cdnight...
https://github.com/jakesgordo...
8.更多討論
1.一個JS文件能夠同時使用兩個有限狀態機嗎?
不一樣的變量名便可
2有限狀態機一般在什麼地方被用到?
大致上編程都是對現實的抽象,有效狀態機也不例外,當邏輯裏面有大量判斷須要轉換狀態時,有限狀態機就有用處了,本質上其是用查表法來把處理邏輯獨立到表中,從而能夠用通用的代碼去處理任意複雜的狀態轉換。具體場景有狀態超多的詞法分析(要識別各類關鍵字,運算符等等),工控軟件中,有些機器的控制邏輯也能夠用到,擴展開來,任何複雜狀態邏輯的處理均可以。
3.有限狀態機有哪些優勢,與普通的,若是判斷語句相比呢?
便於閱讀,理解,維護,更重要的是利於綜合器優化代碼,利於用戶添加合適的時序約束條件,利於佈局佈線器實現設計。