Проще говоря, он имеет три характеристики:
Кода -копия выглядит следующим образом:
* Общее количество состояний (штат) ограничено.
* В любой момент вы находитесь только в одном состоянии.
* При определенных условиях он будет переходить от одного состояния к другому.
Для JavaScript это означает, что многие объекты могут быть написаны как конечные государственные машины.
Например, на веб -странице есть элемент меню. Когда мышь парят, отображается меню; Когда мышь отодвинулась, меню скрыто. Если вы используете описание конечного состояния машины, в этом меню есть только два состояния (показывать и скрыть), и мышь вызовет переход состояния.
Код может быть написан следующим образом:
Кода -копия выглядит следующим образом:
var menu = {
// текущее состояние
CurrentState: 'Hide',
// Связанные события
инициализировать: function () {
var self = это;
self.on ("hover", self.transition);
},
// переход статуса
Переход: функция (событие) {
Switch (this.currentState) {
дело "скрыть":
this.currentState = 'show';
dosomething ();
перерыв;
дело "Show":
this.currentState = 'Hide';
dosomething ();
перерыв;
по умолчанию:
console.log ('недействительное состояние!');
перерыв;
}
}
};
Можно видеть, что метод написания конечных государственных машин ясен в логике и силен в выражении, что способствует инкапсулированию событий. Чем больше состояний есть объект, и тем больше событий он происходит, тем более подходит для использования метода написания конечного состояния машины.
Кроме того, JavaScript - это язык с большим количеством асинхронных операций. Обычно используемым решением является указание функций обратного вызова, но это приведет к таким проблемам, как запутанная структура кода, трудно протестировать и отладка. Машина конечного состояния обеспечивает лучший способ: асинхронные операции с изменением состояния объекта. Когда асинхронная операция завершена, происходит соответствующее изменение состояния, тем самым вызывает другие операции. Это более логически разумно, чем решение функций обратного вызова, прослушивания событий, публикации/подписки и т. Д., И его легче уменьшить сложность кода.
Ниже приведена библиотека с конечным штатом, JavaScript Lecite State Machine. Эта библиотека очень легко понять и может помочь нам углубить наше понимание, и ее функции вообще не слабы.
Эта библиотека предоставляет глобальный объект Statemachine, который использует метод создания объекта для генерации экземпляров машины конечного состояния.
Кода -копия выглядит следующим образом:
var fsm = statemachine.create ();
При генерации необходимо предоставить объект параметра для описания свойств экземпляра. Например, светофоры (светофоры) могут быть описаны следующим образом:
Кода -копия выглядит следующим образом:
var fsm = statemachine.create ({
ИСТИНАЯ: 'Зеленый',
события: [
{name: 'Warn', от: 'green', до: 'желтый'},
{name: 'stop', от: 'jell', to: 'red'},
{name: 'ready', from: 'red', до: 'желтый'},
{name: 'Go', от: 'желтый', до: 'green'}
]
});
Первоначальное состояние светофора зеленое. Атрибут событий - это различные события, которые инициируют изменения состояния, такие как предупреждение, которое заставляет зеленое состояние стать желтым состоянием, событие остановки приводит к тому, что желтое состояние станет красным состоянием и т. Д.
После создания экземпляра вы можете запросить текущее состояние в любое время.
Кода -копия выглядит следующим образом:
* fsm.current: возвращает текущее состояние.
* fsm.is (ы): возвращает логическое значение, указывающее, является ли состояние S текущим состоянием.
* FSM.CAN (E): возвращает логическое значение, указывающее, может ли событие E запустить в текущем состоянии.
* fsm.cannot (e): возвращает логическое значение, указывающее, не может ли событие E в текущем состоянии.
JavaScript Lecite State Machine позволяет указать две функции обратного вызова для каждого события, принимая в качестве примера предупреждение событие:
Кода -копия выглядит следующим образом:
* OnbeForeWarn: запускается до того, как произойдет предупреждение.
* Onafterwarn (может быть сокращена как Onwarn): запускается после того, как произошло событие предупреждения.
В то же время это также позволяет определять две функции обратного вызова для каждого состояния, взяв зеленое состояние в качестве примера:
Кода -копия выглядит следующим образом:
* OnLeaveGreen: запускается при выходе из зеленого состояния.
* OnEntergreen (может быть сокращено как онгрин): запускается при входе в зеленое состояние.
Предполагая, что событие предупреждения изменяет состояние с зеленого на желтый, вышеупомянутые четыре типа функций обратного вызова происходят в следующем порядке: OnbeforeWarn → OnLeaveGreen → OnEneryellow → OnafterWarn.
В дополнение к указанию функции обратного вызова для каждого события и состояния отдельно, вы также можете указать общую функцию обратного вызова для всех событий и состояний.
Кода -копия выглядит следующим образом:
* OnbeForeEvent: запускается до того, как произойдет какое -либо событие.
* OnLeaVestate: запускается при выходе из любого состояния.
* OnEnterstate: запускается при входе в любое состояние.
* onafterevent: запускается после того, как любое событие заканчивается.
Если есть асинхронные операции в функции обратного вызова события (например, общение Ajax с сервером), мы можем подождать, пока асинхронная операция закончится до того, как произойдут изменения состояния. Это требует метода перехода.
Кода -копия выглядит следующим образом:
fsm.onwarn = function () {
light.fadeout ('slow', function () {
fsm.transition ();
});
вернуть statemachine.async;
};
В функции обратного вызова в приведенном выше коде существует асинхронная операция (Light.Fadeout). Если вы не хотите, чтобы состояние изменилось немедленно, вы должны позволить функции обратного вызова возврата объекта StateMachine.Async, указывая, что состояние не изменяется в настоящее время; Подождите, пока асинхронная операция не будет завершена, затем вызовите метод перехода, чтобы привести к изменению состояния.
Машина с конечным состоянием JavaScript также позволяет определять функции обработки ошибок, которые автоматически запускаются, когда события, которые невозможно происходить в текущем состоянии.
Кода -копия выглядит следующим образом:
var fsm = statemachine.create ({
// ...
Ошибка: функция (EventName, от, до, args, errorcode, errorrormessage) {
вернуть 'event' + eventName + ':' + errorrormessage;
},
// ...
});
Например, нынешнее состояние зеленое, и теоретически, в настоящее время может произойти только предупреждающее событие. Если в настоящее время происходит событие остановки, функция обработки приведенной выше ошибки будет запускается.