2012-11-07 10 views
21

Weiß jemand von irgendwelchen Javascript-Implementierungen einer Zustandsmaschine? Mein Ziel ist es, eine State-Machine-Implementierung einzurichten, die Ereignisse an Zustandsübergänge bindet. Wenn also ein Benutzer auf eine Schaltfläche klickt, wird der Status geändert, und dieser Status definiert möglicherweise bestimmte Werte in Objekten, die beispielsweise geändert werden sollen.JavaScript Event-State Machine

Ich will das einfach eine Zustandsmaschine sein, weil es eine Regeln JSON-Datei sein, die diktieren können, was Änderung verschiedenen Objekte Werte, wenn bestimmte Ereignisse genannt werden. Da dies innerhalb der Datei strukturiert sein wird, denke ich, dass es leicht wäre, diese Informationen in ein Zustandsautomatenobjekt zu parsen.

+0

https://github.com/jakesgordon/javascript-state-machine könnte sein, dass Sie suchen. – Gael

Antwort

3

Werfen Sie einen Blick auf https://github.com/steelbreeze/state.js - es unterstützt einen Großteil der State Machine-Semantik wie in der UML 2-Spezifikation beschrieben, während sie noch leistungsfähig ist. Es gibt noch nicht viel Dokumentation, aber die Beispiele und Tests sollten eine gute Referenz sein.

+0

Ich habe diese Bibliothek benutzt und bin sehr zufrieden damit. Wir haben es in unseren thingml-Ansatz integriert (https://github.com/SINTEF-9012/ThingML) – bmorin

1

Mein Pick auf diesem mit der js-FSM Mikro Bibliothek.

Eigenschaften

  • Staat basierend FSM Beschreibung. Ein Zustand bestehend aus a und einer Reihe von Zustandsübergängen.
  • Übergang von Ereignissen. Mehrere Ereignisse definieren ODER-Ereignisse.
  • Übergang von den Bedingungen. Eine Bedingung ist ein Schlüssel: ein Wertpaar, das auf das Bedingungsobjekt passen soll. Mehrere Schlüssel, Wertpaare definierten UND-Bedingungen. Mehrere Bedingungen definieren ORed Bedingungen
  • Jeder Übergang gegebenenfalls Aktionen oder mehrere Aktionen aufrufen können. Aktionen können optional Argumente haben oder Mitglieder davon sein.
  • Die Statusmaschine kann mit einem vorhandenen Objekt oder dem Prototyp eines Konstruktors (als Mixin) gemischt werden. Eine Methode hierfür wird bereitgestellt.
  • Der Statusrechner kann optional protokollieren, wenn eine Protokollmethode auf diesem System vorhanden ist oder bereitgestellt wird.
  • AMD und Node-Module unterstützt.
  • Unit-Tests mit QUnit.

js-fsm github page.

3

Etwas Werbung für meine Zustandsmaschine: stateflow Ich habe gerade meine eigene Zustandsmaschine erstellt, weil ich keine gefunden habe, die einfach genug für mich war.

ein Ablauf wird mit einem js-Objekt definiert, wobei die Eigenschaft der Name des Status ist und der Wert ein anderes js-Objekt mit folgenden Eigenschaften ist.

  • Typ: Anfang, Ende oder Status (Standard).
  • action: function mit einem State-Instanzobjekt, das auf diesen Wert gesetzt wird, kann auch als zuvor registrierte Action oder eine andere Flow-Definition bezeichnet werden. In diesem Fall handelt es sich um einen Subflow.
  • auf: Eigenschaft ist der nächste Zustand zu goto

Einfaches Beispiel

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

es Ereignis und Wert gelegt werden, prüfen Sie auf git https://github.com/philipdev/stateflow oder über npm

4

ich vor kurzem eine Zustandsmaschine Umsetzung in JS gebaut, die sicherlich die am einfachsten zu konfigurieren, dank seines Übergang DSL:

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

Es ist wirklich flexibel sowohl in der Konfiguration und Event-Handler-Zuordnung, können Sie hinzufügen und entfernen Staaten zur Laufzeit, Pause und Übergänge wieder aufzunehmen, in eine Tonne Ereignisse Haken, mit Helfern für jQuery und reaktiven Frameworks wie Vue:

state-machine-demo

Dokumente und eine ganze Reihe von dER os hier: