Einfach ausgedrückt, es hat drei Eigenschaften:
Die Codekopie lautet wie folgt:
* Die Gesamtzahl der Staaten (Staat) ist begrenzt.
* Jeder Moment sind Sie nur in einem Zustand.
* Unter bestimmten Bedingungen wechselt es von einem Zustand in einen anderen.
Was es für JavaScript bedeutet, ist, dass viele Objekte als endliche Zustandsmaschinen geschrieben werden können.
Zum Beispiel gibt es auf der Webseite ein Menüelement. Wenn die Maus schwebt, wird das Menü angezeigt. Wenn die Maus wegbewegt ist, ist das Menü versteckt. Wenn Sie die Beschreibung der Finite -Status -Maschine verwenden, verfügt dieses Menü nur über zwei Zustände (anzeigen und ausblenden), und die Maus löst einen Zustandsübergang aus.
Der Code kann wie folgt geschrieben werden:
Die Codekopie lautet wie folgt:
var mseu = {
// aktueller Status
CurrentState: 'Hide',
// Bindungsereignisse
initialisieren: function () {
var self = this;
self.on ("schweben", self.transition);
},
// Statusübergang
Übergang: Funktion (Ereignis) {
Switch (this.currentState) {
Fall "Versteck":
this.currentState = 'show';
dosometing ();
brechen;
Fall "Show":
this.currentState = 'hide';
dosometing ();
brechen;
Standard:
console.log ('Ungültiger Zustand!');
brechen;
}
}
};
Es ist ersichtlich, dass die Schreibmethode von Finite -Status -Maschinen in der Logik klar und stark in Expression ist, was der Einkapselung von Ereignissen förderlich ist. Je mehr Staaten ein Objekt hat und je mehr Ereignisse es auftritt, desto geeigneter ist es, die Schreibmethode für endliche Zustandsmaschine zu verwenden.
Darüber hinaus ist JavaScript eine Sprache mit vielen asynchronen Operationen. Die häufig verwendete Lösung besteht darin, Rückruffunktionen anzugeben. Dies führt jedoch zu Problemen wie verwirrender Codestruktur, schwer zu testen und debuggen. Die endliche Zustandsmaschine bietet einen besseren Weg: asynchrone Operationen mit der Zustandsänderung des Objekts. Wenn der asynchrone Betrieb abgeschlossen ist, tritt eine entsprechende Zustandsänderung auf, wodurch andere Operationen ausgelöst werden. Dies ist logisch vernünftiger als die Lösung von Rückruffunktionen, Ereignishörungen, Veröffentlichungen/Abonnieren usw. und leichter zu reduzieren, die Komplexität des Codes zu verringern.
Das Folgende ist eine Finite -Status -Maschinenbibliothek, JavaScript Finite State Machine. Diese Bibliothek ist sehr leicht zu verstehen und kann uns helfen, unser Verständnis zu vertiefen, und ihre Funktionen sind überhaupt nicht schwach.
Diese Bibliothek bietet eine globale Objektstatemachine, in der die Methode des Objekts erstellen wird, um Instanzen einer endlichen Zustandsmaschine zu generieren.
Die Codekopie lautet wie folgt:
var fsm = Statemachine.create ();
Beim Generieren muss ein Parameterobjekt bereitgestellt werden, um die Eigenschaften der Instanz zu beschreiben. Zum Beispiel können Ampeln (Ampeln) wie folgt beschrieben werden:
Die Codekopie lautet wie folgt:
var fsm = Statemachine.create ({{
initial: 'grün',
Ereignisse: [
{Name: 'warn', von: 'grün', zu: 'gelb'},
{Name: 'Stop', von: 'gelb', zu: 'rot'},
{Name: 'Ready', von: 'rot', bis: 'gelb'},
{Name: 'Go', von: 'gelb', zu: 'grün'}
]
});
Der anfängliche Zustand der Ampel ist grün. Das Ereignisattribut sind verschiedene Ereignisse, die Zustandsänderungen auslösen, z.
Nach dem Generieren der Instanz können Sie jederzeit den aktuellen Status abfragen.
Die Codekopie lautet wie folgt:
* fsm.current: Gibt den aktuellen Status zurück.
* fsm.is (s): Gibt einen booleschen Wert zurück, der angibt, ob der Zustand S der aktuelle Zustand ist.
* fsm.can (e): Gibt einen booleschen Wert zurück, der angibt, ob Ereignis E im aktuellen Zustand ausgelöst werden kann.
* FSM.Cannot (E): Gibt einen booleschen Wert zurück, der angibt, ob Ereignis E im aktuellen Zustand nicht ausgelöst werden kann.
JavaScript Finite State Machine ermöglicht die Angabe von zwei Rückruffunktionen für jedes Ereignis, wobei das Warnereignis als Beispiel aufgenommen wird:
Die Codekopie lautet wie folgt:
* Onbeforewarn: Ausgelöst vor dem Warnereignis.
* On nach dem WARN -Ereignis ausgelöst werden als Onwarn als Onwarn ausgelöst werden.
Gleichzeitig ermöglicht es auch, zwei Rückruffunktionen für jeden Staat anzugeben, wobei der grüne Zustand als Beispiel einnimmt:
Die Codekopie lautet wie folgt:
* OnleaveGreen: Ausgelöst, wenn Sie den grünen Zustand verlassen.
* ONENTERGREEN (kann als Ongreen abgekürzt werden): beim Betreten des grünen Zustands ausgelöst werden.
Unter der Annahme, dass das Warn -Ereignis den Zustand von grün bis gelb ändert, treten die oben genannten vier Arten von Rückruffunktionen in der folgenden Reihenfolge auf: Onbeforewarn → OnleaveGreen → ONenteryellow → on nach Afterwarn.
Zusätzlich zur Angabe einer Rückruffunktion für jedes Ereignis und für jeden Zustand können Sie auch eine gemeinsame Rückruffunktion für alle Ereignisse und Zustände angeben.
Die Codekopie lautet wie folgt:
* Onbeforevent: Ausgelöst, bevor ein Ereignis auftritt.
* OnleAwestate: Ausgelöst, wenn Sie einen Zustand verlassen.
* ONENTERSTATE: Ausgelöst, wenn Sie einen Zustand betreten.
* On nach dem Ende eines Ereignisses ausgelöst.
Wenn in der Rückruffunktion des Ereignisses asynchrone Operationen vorhanden sind (z. B. AJAX -Kommunikation mit dem Server), möchten wir möglicherweise warten, bis der asynchrone Betrieb beendet ist, bevor die Zustandsänderungen auftreten. Dies erfordert die Übergangsmethode.
Die Codekopie lautet wie folgt:
fsm.onwarn = function () {
light.fadeout ('langsam', function () {
fsm.transition ();
});
return Statemachine.async;
};
In der Rückruffunktion im obigen Code gibt es einen asynchronen Betrieb (Light.Fadeout). Wenn Sie nicht möchten, dass sich der Status sofort ändert, müssen Sie die Rückruffunktion eine Statemachine.aSync -Objekt zurückgeben lassen, was darauf hinweist, dass sich der Status vorerst nicht ändert. Warten Sie, bis der asynchrone Betrieb abgeschlossen ist, und rufen Sie dann die Übergangsmethode an, um den Zustand zu veranlassen.
Die JavaScript -Finite -Status -Maschine ermöglicht auch die Angabe von Fehlerbehandlungsfunktionen, die automatisch ausgelöst werden, wenn Ereignisse, die im aktuellen Status nicht auftreten können.
Die Codekopie lautet wie folgt:
var fsm = Statemachine.create ({{
// ...
Fehler: Funktion (Ereignisname, von, bis, args, errorCode, errormessage) {
Return 'Ereignis' + Ereignisname + ':' + errormessage;
},
// ...
});
Zum Beispiel ist der aktuelle Zustand grün und theoretisch kann zu diesem Zeitpunkt nur ein Warnereignis stattfinden. Wenn zu diesem Zeitpunkt ein Stop -Ereignis erfolgt, wird die obige Fehlerbehandlungsfunktion ausgelöst.