Машина состояний с «инерцией» в node.js?

Подскажите, какой самый правильный способ спроектировать API в следующей ситуации.


Имеется некоторый объект, который находится в одном из предопределенных состояний S={s1…sn}. Также есть метод(ы), изменяющие состояние объекта. Для перехода из одного состояния в другое требуется выполнить цепочку асинхронных вызовов, то есть переключение состояний происходит не мгновенно.


Фактически, множество состояний выглядит как S'=S∪{stransitional}. До тех пор, пока переключение не завершено, объект находится в переходном состоянии (stransitional). В переходном состоянии нельзя вызывать методы, инициирующие новое переключение состояний. Что делать, если такой вызов все таки произошел — вопрос открытый (например, можно возврашать ошибку сразу, или ставить в очередь).


Нет ли какого-то стандартного решения в данной ситуации?


Я склоняюсь к тому, чтобы клиент узнавал об изменении состояния не через callback, передаваемый в метод, а через интерфейс EventEmitter. Внутри объекта поддерживать пару <Sreal,Starget>: настоящее состояние, которое изменяется с задержкой, и «целевое» состояние, которое выставляется мгновенно.


PS. В моей задаче «объект» это интерфейс к цифровому фотоаппарату.
  • Вопрос задан
  • 3213 просмотров
Пригласить эксперта
Ответы на вопрос 2
Я бы использовал queue и series из библиотеки async.
Ответ написан
Mezomish
@Mezomish
Разумеется, нет никакого «стандартного» решения, всё зависит от конкретной реализации.

В простейшем случае можно сделать банальную очередь переходов, т.е. новый переход вызывается не мгновенно, а только после того, как полностью закончится предыдущий. Минусы очевидны — возможен UI-лаг, когда реакция на действия пользователя происходит с задержкой. Плюсы — проще в реализации.

А можно в качестве примера взять Qt Animation Framework, в котором это сделано довольно элегантно: там переход из состояния в состояние стоит отдельно, а визуальные анимации — отдельно. И промежуточных состояний нет. Таким образом при команде «перейди в такое-то состояние» переключение происходит мгновенно, а анимация в этот момент только-только начинается.
Если анимация ещё не завершилась, но уже поступает команда на следующий переход, то само переключение состояния происходит снова мгновенно, а анимация «подстраивается» под новые данные: старая анимация не завершается, а останавливается на том месте, где её застала новая команда, и уже из этого положения стартует анимация до новой точки. Минусы — сложнее в реализации. Плюсы — очень красиво и естественно :)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы