Узлы состояния¶
Конечный автомат содержит узлы состояний (state nodes), которые в совокупности описывают общее состояние (state), в котором может находиться автомат. В автомате fetchMachine, описанном в следующем разделе, есть узлы состояний, такие как:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
И общее состояние (state), которое является возвращаемым значением функции machine.transition() или значением обратного вызова service.onTransition():
1 2 3 4 5 6 7 8 9 | |
Что такое узлы состояния?¶
В XState узел состояния (state node) определяет конфигурацию состояния. Они определены в свойстве state автомата. Точно так же узлы подсостояния иерархически определены в свойстве states узла состояния.
Состояние, определенное из machine.transition(state, event), представляет собой комбинацию узлов состояния. Например, в автомате ниже есть узел состояния success и узел подсостояния items. Значение состояния {success: 'items'} представляет комбинацию этих узлов состояния.
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 32 33 34 35 36 37 38 39 40 41 42 43 44 | |
Типы узлов состояния¶
Есть пять различных типов узлов состояния:
- Узел атомарного (atomic) состояния не имеет дочерних состояний.
- Узел составного (compound) состояния содержит одно или несколько дочерних состояний и имеет начальное состояние, которое является ключом одного из этих дочерних состояний.
- Узел параллельного (parallel) состояния содержит два или более дочерних состояния и не имеет начального состояния, так как он представляет нахождение во всех своих дочерних состояниях одновременно.
- Узел конечного (final) состояния — это конечный узел, который представляет абстрактное «конечное» состояние.
- Узел состояния истории (history) — это абстрактный узел, который представляет преобразование в самое последнее мелкое или глубокое состояние истории своего родительского узла.
Тип узла состояния может быть явно определен на узле состояния:
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | |
Явное указание type как 'atomic', 'compound', 'parallel', 'history' или 'final' полезно для анализа и проверки типов в TypeScript. Однако это требуется только для параллельного, исторического и конечного состояний.
Узлы проходного состояния¶
Узел проходного состояния (transient state node) — это "проходной" узел состояния, который немедленно переходит к другому узлу состояния; то есть автомат не остается в проходном состоянии. Узлы проходного состояния полезны для определения того, в какое состояние автомат должен действительно перейти из предыдущего состояния на основе условий. Они больше всего похожи на псевдосостояния выбора в UML.
Лучший способ определить узел проходного состояния — это бессобытийное состояние (eventless state) и постоянный переход always. Это переход, при котором немедленно выполняется первое условие, которое оценивается как истинное.
Например, начальное переходное состояние этого автомата преобразуется в 'morning', 'afternoon' или 'evening', в зависимости от того, какое сейчас время (детали реализации скрыты):
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 32 33 34 35 36 | |
Метаданные узла состояния¶
Мета-данные, которые представляют собой статические данные, описывающие соответствующие свойства любого узла состояния, могут быть указаны в свойстве .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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | |
Текущее состояние машины собирает .meta-данные всех узлов состояния, представленных значением состояния, и помещает их в объект, где:
- Ключи — это идентификаторы узлов состояния.
- Значения — это значения мета-узла состояния
.meta.
Теги¶
Узлы состояния могут иметь теги (tags), которые представляют собой строковые термины, помогающие описать узел состояния. Теги - это метаданные, которые могут быть полезны при классификации узлов различных состояний. Например, вы можете указать, какие узлы состояния представляют состояния, в которых данные загружаются, с помощью тега "loading" и определить, содержит ли состояние эти тегированные узлы состояния с помощью state.hasTag(tag):
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 | |