Sederhananya, ia memiliki tiga karakteristik:
Salinan kode adalah sebagai berikut:
* Jumlah total negara (negara) terbatas.
* Setiap saat, Anda hanya dalam satu negara bagian.
* Dalam kondisi tertentu, itu akan beralih dari satu negara ke negara lain.
Apa artinya bagi JavaScript adalah bahwa banyak objek dapat ditulis sebagai mesin negara yang terbatas.
Misalnya, ada elemen menu di halaman web. Saat mouse melayang, menu ditampilkan; Ketika mouse dipindahkan, menu disembunyikan. Jika Anda menggunakan deskripsi Mesin Negara yang terbatas, menu ini hanya memiliki dua negara (Tampilkan dan Sembunyikan), dan mouse akan memicu transisi keadaan.
Kode dapat ditulis sebagai berikut:
Salinan kode adalah sebagai berikut:
var menu = {
// status saat ini
CurrentState: 'Sembunyikan',
// acara yang mengikat
inisialisasi: function () {
var self = ini;
self.on ("hover", self.transition);
},
// Transisi Status
transisi: function (event) {
sakelar (this.currentState) {
Kasus "Sembunyikan":
this.currentState = 'show';
dosomething ();
merusak;
Kasus "Tampilkan":
this.currentState = 'hide';
dosomething ();
merusak;
bawaan:
console.log ('status tidak valid!');
merusak;
}
}
};
Dapat dilihat bahwa metode penulisan mesin keadaan terbatas jelas dalam logika dan kuat dalam ekspresi, yang kondusif untuk merangkum peristiwa. Semakin banyak negara yang dimiliki suatu objek dan semakin banyak peristiwa yang terjadi, semakin cocok untuk menggunakan metode penulisan mesin negara yang terbatas.
Selain itu, JavaScript adalah bahasa dengan banyak operasi asinkron. Solusi yang umum digunakan adalah menentukan fungsi panggilan balik, tetapi ini akan menyebabkan masalah seperti struktur kode yang membingungkan, sulit untuk diuji dan debugging. Mesin negara yang terbatas memberikan cara yang lebih baik: Hook Operasi Asinkron dengan Perubahan Negara Objek. Ketika operasi asinkron selesai, perubahan keadaan yang sesuai terjadi, sehingga memicu operasi lain. Ini lebih masuk akal secara logis daripada solusi fungsi panggilan balik, mendengarkan acara, menerbitkan/berlangganan, dll., Dan lebih mudah untuk mengurangi kompleksitas kode.
Berikut ini adalah Perpustakaan Mesin Negara yang terbatas, JavaScript Finite State Machine. Perpustakaan ini sangat mudah dimengerti dan dapat membantu kita memperdalam pemahaman kita, dan fungsinya tidak lemah sama sekali.
Perpustakaan ini menyediakan statemachine objek global, yang menggunakan metode CREATE objek untuk menghasilkan contoh mesin negara yang terbatas.
Salinan kode adalah sebagai berikut:
var fsm = statemachine.create ();
Saat menghasilkan, objek parameter perlu disediakan untuk menggambarkan sifat -sifat instance. Misalnya, lampu lalu lintas (lampu lalu lintas) dapat digambarkan sebagai berikut:
Salinan kode adalah sebagai berikut:
var fsm = statemachine.create ({
Awal: 'Hijau',
Acara: [
{name: 'warn', from: 'green', to: 'yellow'},
{name: 'stop', from: 'yellow', to: 'red'},
{name: 'Ready', From: 'Red', to: 'Yellow'},
{name: 'go', from: 'yellow', to: 'green'}
]
});
Keadaan awal lampu lalu lintas berwarna hijau. Atribut peristiwa adalah berbagai peristiwa yang memicu perubahan keadaan, seperti peristiwa peringatan yang menyebabkan keadaan hijau menjadi keadaan kuning, peristiwa berhenti menyebabkan keadaan kuning menjadi negara merah, dll.
Setelah menghasilkan instance, Anda dapat meminta status saat ini kapan saja.
Salinan kode adalah sebagai berikut:
* fsm.current: Mengembalikan status saat ini.
* fsm.is: Mengembalikan nilai boolean yang menunjukkan apakah keadaan adalah keadaan saat ini.
* fsm.can (e): Mengembalikan nilai boolean yang menunjukkan apakah peristiwa e dapat dipicu dalam keadaan saat ini.
* fsm.cannot (e): Mengembalikan nilai boolean yang menunjukkan apakah peristiwa e tidak dapat dipicu dalam keadaan saat ini.
JavaScript Mesin Negara Terbatas memungkinkan menentukan dua fungsi panggilan balik untuk setiap acara, mengambil acara peringatan sebagai contoh:
Salinan kode adalah sebagai berikut:
* Onbeforewarn: dipicu sebelum peristiwa peringatan terjadi.
* Onafterwarn (dapat disingkat sebagai onwarn): dipicu setelah peristiwa Warn terjadi.
Pada saat yang sama, ini juga memungkinkan menentukan dua fungsi panggilan balik untuk setiap negara bagian, mengambil keadaan hijau sebagai contoh:
Salinan kode adalah sebagai berikut:
* onleavegreen: dipicu saat meninggalkan keadaan hijau.
* OnENTERGREEN (dapat disingkat sebagai Ongreen): dipicu saat memasuki keadaan hijau.
Dengan asumsi bahwa peristiwa Warn mengubah keadaan dari hijau menjadi kuning, empat jenis fungsi callback di atas terjadi dalam urutan berikut: OnbeforeWarn → Onleavegreen → Onenteryellow → OnAffterwarn.
Selain menentukan fungsi panggilan balik untuk setiap acara dan status secara terpisah, Anda juga dapat menentukan fungsi panggilan balik umum untuk semua acara dan negara bagian.
Salinan kode adalah sebagai berikut:
* OnBeforeEvent: dipicu sebelum peristiwa apa pun terjadi.
* onleavestate: dipicu saat meninggalkan negara bagian apa pun.
* Onenterstate: dipicu saat memasuki keadaan apa pun.
* OnAfreVent: dipicu setelah kedua peristiwa berakhir.
Jika ada operasi asinkron dalam fungsi panggilan balik dari acara tersebut (seperti komunikasi AJAX dengan server), kami mungkin ingin menunggu sampai operasi asinkron selesai sebelum perubahan keadaan terjadi. Ini membutuhkan metode transisi.
Salinan kode adalah sebagai berikut:
fsm.onwarn = function () {
light.fadeout ('slow', function () {
fsm.transition ();
});
return statemachine.async;
};
Dalam fungsi callback dalam kode di atas, ada operasi asinkron (Light.fadeout). Jika Anda tidak ingin negara bagian segera berubah, Anda harus membiarkan fungsi panggilan balik mengembalikan objek statemachine.async, menunjukkan bahwa negara tidak berubah untuk saat ini; Tunggu sampai operasi asinkron selesai, lalu hubungi metode transisi untuk menyebabkan keadaan berubah.
JavaScript Mesin Negara Hingga juga memungkinkan menentukan fungsi penanganan kesalahan yang secara otomatis dipicu ketika peristiwa yang tidak mungkin terjadi dalam keadaan saat ini.
Salinan kode adalah sebagai berikut:
var fsm = statemachine.create ({
// ...
Kesalahan: Fungsi (eventName, from, to, args, errorCode, errorMessage) {
return 'event' + eventName + ':' + errorMessage;
},
// ...
});
Misalnya, keadaan saat ini berwarna hijau, dan secara teoritis, hanya peristiwa peringatan yang dapat terjadi pada saat ini. Jika peristiwa berhenti terjadi saat ini, fungsi penanganan kesalahan di atas akan dipicu.