Порождение акторов
Иногда вызов акторов может быть недостаточно гибким для ваших нужд. Например, вы можете захотеть:
- Вызвать дочерние автоматы, которые существуют в нескольких состояниях
- Вызвать динамическое количество акторов
Вы можете сделать это путём порождения актора вместо вызова. Акторы, созданные путём порождения, являются порождёнными акторами, а акторы, созданные с помощью invoke — вызванными акторами.
Есть два способа порождения: создатель действия spawnChild или вспомогательная функция spawn для assign.
В большинстве случаев предпочтительнее использовать spawnChild, который заставляет актора быть порождённым и может принимать настраиваемый ID для последующей ссылки на актора:
1 2 3 4 5 | |
Вы можете использовать spawnChild для нескольких порождённых акторов:
1 2 3 4 5 6 7 | |
Вы также можете использовать вспомогательную функцию spawn, предоставляемую создателем действия assign, которая позволяет хранить ссылку на порождённого актора (ActorRef) в context автомата:
1 2 3 4 5 6 7 8 | |
Однако, если вы используете spawn, убедитесь, что вы удаляете ActorRef из context для предотвращения утечек памяти, когда порождённый актор больше не нужен:
1 2 3 4 | |
Вы можете порождать (spawn) столько акторов, сколько вам нужно:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Если вам не нужно отслеживать ссылку на порождённого актора (например, для анонимных порождённых акторов), вы можете использовать создатель действия spawnChild. Он не возвращает ссылку, но указывает интерпретатору XState, что должен быть порождён новый актор:
1 2 3 4 5 | |
API¶
1 2 3 4 5 | |
spawn(actorBehavior, options?)actorBehavior- Поведение порождаемого актора. Это может быть функция, промис, observable или колбэк.options- Опции для порождения актора.id(необязательно) - ID актора. Используется для ссылки на актора в конечном автомате.input(необязательно) - Входные данные для передачи актору.systemId(необязательно) - Строка, идентифицирующая актора, уникальная в масштабе всей системы.
Источник¶
- Встроенный:
spawn(fromPromise(...)) - По ссылке:
spawn('getUser').provide({ actors })
Жизненный цикл¶
- Создаётся и запускается при порождении
- Останавливается при остановке автомата
- Может быть остановлен вручную
Остановка актора¶
Вы можете остановить дочернего актора с помощью действия «stop child». Это действие создаётся из создателя действия stopChild(id).
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 | |
Остановка дочернего актора не удаляет его из context. Чтобы удалить его из context, используйте создатель действия assign(...):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
Spawn и TypeScript¶
TypeScript
XState v5 требует TypeScript версии 5.0 или выше.
Для лучших результатов используйте последнюю версию TypeScript. Подробнее о XState и TypeScript
Скоро будет
Шпаргалка по spawn¶
Базовое порождение¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Порождение с Context¶
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
Порождение разных типов акторов¶
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 | |
Опции порождения¶
1 2 3 4 5 | |
Остановка порождённых акторов¶
1 2 3 4 5 6 7 8 9 10 11 | |
Динамическое порождение¶
1 2 3 4 5 6 7 8 9 10 | |
Лучшие практики¶
- Всегда указывайте
id, когда вам нужно ссылаться на актора позже - Очищайте ссылки на акторов из context при их остановке
- Используйте
spawnChildдля одноразовых акторов, которым не нужны ссылки в context - Используйте
spawnсassign, когда вам нужно отслеживать ссылки на акторов - Рассмотрите использование
systemIdдля акторов, которые должны быть глобально уникальными