2012-11-07 93 views
21

有沒有人知道任何狀態機的JavaScript實現?我的目標是設置一個狀態機實現,將事件綁定到狀態轉換。所以,如果用戶點擊一個按鈕,那麼狀態將被改變,並且這個狀態可以在例如要改變的對象中定義某些值。JavaScript事件狀態機

我希望這是一個狀態機,因爲會有一個規則的json文件,它允許指定某些事件被調用時各種對象的值變化。因爲這將在文件中構造,我認爲將這些信息解析成狀態機對象很容易。

+0

https://github.com/jakesgordon/javascript-state-machine可能是你要尋找的。 – Gael

回答

3

嘗試看看https://github.com/steelbreeze/state.js - 它支持大部分狀態機語義,如UML 2規範中所述,同時仍具有高性能。 目前還沒有太多的文檔,但這些例子和測試應該提供一個很好的參考。

+0

我一直在使用這個庫,我對它非常滿意。我們將它集成到我們的thingml方法(https://github.com/SINTEF-9012/ThingML) – bmorin

1

我選擇這個與js-fsm微庫。

特點基於

  • 國家FSM描述。由狀態轉換組成的狀態。
  • 從事件過渡。多個事件定義ORed事件。
  • 從條件轉變。條件是應匹配條件對象的鍵:值對。多個鍵值對定義了與條件。多個條件定義「或」條件
  • 每個轉換可以選擇調用動作或多個動作。動作可以有選擇地擁有參數或者是其成員。
  • 狀態機可以混合(作爲混合)到現有對象或構造函數的原型。爲此提供了一種方法。
  • 狀態機可以選擇性地記錄日誌方法是否存在或提供。
  • 支持AMD和Node模塊。
  • 使用QUnit進行單元測試。

js-fsm github page.

3

我的狀態機的一點促銷:stateflow 我剛剛創建了自己的狀態機,因爲我找不到對我來說足夠簡單的狀態機。

流是使用js對象定義的,其中屬性是狀態名,值是具有以下屬性的另一個js對象。

  • 類型:開始,結束或狀態(默認)。
  • 動作:帶有一個狀態實例對象的函數被設置爲this,也可以被命名爲先前已註冊的動作或另一個流動定義,在這種情況下它是一個子流。
  • 上:財產是要匹配的事件和價值是下一個狀態轉到

簡單的例子

var stateflow = require('stateflow'); 
var flow = new stateflow.StateFlow({ 
    a: { 
     type:'begin', 
     action: function(complete) { 
      // do something 
      complete('done');  
     }, 
     on: { 
      done:'b', 
      again:'a' 
     } 
    }, 
    b: { 
     type:'end', 
     action: function(complete) { 
      complete('finished'); 
     } 
    } 
}); 
flow.start(function(event) { 
    console.log('flow result:', event); 
}); 

檢查出來的混帳https://github.com/philipdev/stateflow或通過NPM

4

我最近建於JS的狀態機實現,這當然是最簡單的配置,由於其過渡DSL:

transitions: [ 
    'next : intro > form > finish', 
    'back : intro < form   < error', 
    'error :   form >   error', 
    'restart : intro  < finish' 
] 

這兩個配置和事件處理程序分配真正靈活,你可以添加和在運行時刪除狀態,暫停和恢復過渡,勾成噸的事件,與助手的jQuery和無框架,如VUE:

state-machine-demo

Docs和DEM一大堆這裏的操作系統: