Подскажите, какой самый правильный способ спроектировать API в следующей ситуации.
Имеется некоторый объект, который находится в одном из предопределенных состояний S={s
1…s
n}. Также есть метод(ы), изменяющие состояние объекта. Для перехода из одного состояния в другое требуется выполнить цепочку асинхронных вызовов, то есть переключение состояний происходит не мгновенно.
Фактически, множество состояний выглядит как S'=S∪{s
transitional}. До тех пор, пока переключение не завершено, объект находится в переходном состоянии (s
transitional). В переходном состоянии нельзя вызывать методы, инициирующие новое переключение состояний. Что делать, если такой вызов все таки произошел — вопрос открытый (например, можно возврашать ошибку сразу, или ставить в очередь).
Нет ли какого-то стандартного решения в данной ситуации?
Я склоняюсь к тому, чтобы клиент узнавал об изменении состояния не через callback, передаваемый в метод, а через интерфейс
EventEmitter. Внутри объекта поддерживать пару <S
real,S
target>: настоящее состояние, которое изменяется с задержкой, и «целевое» состояние, которое выставляется мгновенно.
PS. В моей задаче «объект» это интерфейс к цифровому фотоаппарату.