Состояние
Состояние описывает статус или режим автомата, который может быть таким простым, как Пауза и Воспроизведение. Конечный автомат может находиться только в одном состоянии в каждый момент времени.
Эти состояния «конечны»; автомат может переходить только между состояниями, которые вы предварительно определили.
Совет
Посмотрите наше видео "Что такое состояния?" на YouTube (53 сек).
Объект состояния¶
Объект состояния представляет текущее состояние работающего автомата (актора) и содержит следующие свойства:
value: текущее значение состояния, которое является либо:- строкой, представляющей простое состояние, например
'playing', или: - объектом, представляющим вложенные состояния, например
{ paused: 'buffering' }.
- строкой, представляющей простое состояние, например
context: текущий context (расширенное состояние).meta: объект, содержащий метаданные узла состояния.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
Доступ к снимкам состояния¶
Вы можете получить доступ к сгенерированному состоянию актора (или снимку), подписавшись на актора или прочитав метод .getSnapshot().
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Значение состояния¶
Конечный автомат с вложенными состояниями (или диаграмма состояний) представляет собой древовидную структуру, где каждый узел является узлом состояния. Корневой узел состояния — это узел верхнего уровня, представляющий весь автомат. Корневой узел может иметь дочерние узлы состояний, которые могут иметь дочерние узлы состояний и так далее.
Значение состояния — это объект, представляющий все активные узлы состояний в автомате. Для конечных автоматов с узлами состояний без дочерних узлов значение состояния является строкой:
Скоро появится визуальный пример.
state.value === 'question'state.value === 'thanks'state.value === 'closed'
Для конечных автоматов с родительскими узлами состояний значение состояния является объектом:
Скоро появится визуальный пример.
state.value === { form: 'invalid' }— это представляет конечный автомат с активным дочерним узлом с ключомform, который имеет активный дочерний узел с ключомinvalid
Для конечных автоматов с параллельными узлами состояний значение состояния содержит объект(ы) с несколькими ключами для каждого региона узла состояния:
1 2 3 4 5 | |
Конечные автоматы также могут не иметь узлов состояний, кроме корневого узла. Для таких автоматов значение состояния равно null.
Context состояния¶
Конечные автоматы могут иметь context — объект, представляющий расширенное состояние автомата. Context неизменяем и может быть обновлён только путём присваивания в действии. Вы можете прочитать свойство state.context, чтобы получить текущий context.
1 2 3 4 | |
- Объект пуст
{}(по умолчанию), еслиcontextне указан в конфигурации автомата - Никогда не изменяйте этот объект напрямую; его следует рассматривать как неизменяемый/только для чтения
Дочерние элементы состояния¶
Свойство state.children представляет всех текущих порождённых/вызванных акторов в текущем состоянии. Это объект с ключами, представляющими ID акторов, и значениями, представляющими экземпляры ActorRef.
- Здесь вы получаете доступ к порождённым/вызванным акторам по их ID
- Поэтому вам следует давать порождённым/вызванным акторам ID
- Остановленные акторы не будут отображаться здесь
state.can(eventType)¶
Метод state.can(event) определяет, вызовет ли объект event изменение состояния, если он будет отправлен актору автомата. Метод вернёт true, если состояние изменится в результате отправки event; в противном случае метод вернёт false:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | |
Состояние считается «изменённым», если для данного state и объекта event активирован переход.
Внимание
Метод state.can(...) также проверит условия переходов, выполняя их. Условия переходов должны быть чистыми функциями.
state.hasTag(tag)¶
Метод state.hasTag(tag) определяет, имеет ли какой-либо узел состояния в текущем значении состояния заданный tag. Это полезно для определения, является ли состояние конкретным состоянием или принадлежит ли состояние к определённой группе состояний.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Предпочитайте использовать state.hasTag(tag) вместо state.matches(stateValue), так как state.hasTag(tag) более устойчив к изменениям в автомате.
state.matches(stateValue)¶
Метод state.matches(stateValue) определяет, соответствует ли текущее state.value заданному stateValue. Если текущее state.value является «подмножеством» предоставленного stateValue, то метод вернёт true.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
state.output¶
Свойство state.output представляет выходные данные конечного автомата, когда он находится в финальном состоянии верхнего уровня; т.е. state.status === 'done'.
1 2 3 4 5 | |
state.getMeta()¶
Метод state.getMeta() представляет метаданные всех узлов состояний в state. Это объект с ключами, представляющими ID узлов состояний, и значениями, которые являются метаданными этого узла состояния.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Описания состояний¶
Вы можете добавить .description к состояниям, чтобы описать их назначение и поделиться связанными заметками с вашей командой. В редакторе Stately Studio эти описания отображаются в автомате и поддерживают markdown, включая ссылки, изображения и списки. Подробнее об описаниях в Stately Studio.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
Шпаргалка по состояниям¶
Шпаргалка: чтение или сопоставление значения состояния¶
1 2 3 4 5 | |
Шпаргалка: чтение context состояния¶
1 | |
Шпаргалка: чтение output состояния¶
1 2 3 4 5 6 7 | |
Шпаргалка: чтение метаданных состояния¶
1 | |