Skip to Content
👋 Добро пожаловать в документацию lite-fsm!

Глобальные эффекты

Глобальные эффекты в lite-fsm позволяют выполнять действия в ответ на любые события или состояния, независимо от конкретного состояния автомата. Это мощный инструмент для реализации сквозной функциональности, такой как логирование, аналитика или мониторинг состояния системы.

Концепция глобальных эффектов

Глобальные эффекты определяются с использованием специального символа "*" в определении эффектов и срабатывают при любом переходе или событии.

Создание глобальных эффектов

Для определения глобального эффекта используйте символ "*" в качестве ключа в объекте effects:

import { createMachine } from "lite-fsm"; export const analytics = createMachine({ config: { IDLE: {}, }, initialState: "IDLE", initialContext: {}, effects: { "*": ({ action, services, getState }) => { switch (action.type) { case "LOGIN_RESOLVE": const userId = getState().session.context.data?.user_id ?? -1; services.ymService.reachgoal("auth", userId); break; } }, }, });

Параметры глобальных эффектов

Глобальные эффекты получают те же параметры, что и обычные эффекты, включая:

  • action - текущее действие, которое привело к переходу
  • transition - функция для вызова нового перехода
  • services - зависимости, предоставленные через setDependencies
  • getState - функция для получения текущего состояния всех автоматов
effects: { "*": ({ action, transition, services, getState }) => { // Используйте все доступные параметры const currentState = getState(); console.log(`Action: ${action.type}`, action.payload); console.log(`Global state:`, currentState); // При необходимости можно вызвать новый переход if (action.type === "CRITICAL_ERROR") { services.logger.error("Critical error occurred", action.payload); transition({ type: "SHOW_ERROR_DIALOG", payload: action.payload }); } }, }

Типичные сценарии использования

1. Отслеживание аналитики

Один из самых распространенных случаев использования глобальных эффектов - отправка событий в системы аналитики:

const analyticsMachine = createMachine({ config: { IDLE: {}, }, initialState: "IDLE", initialContext: {}, effects: { "*": ({ action, services, getState }) => { // Отправляем все действия в аналитику try { if (action.type.startsWith("__")) { // Пропускаем служебные события (начинающиеся с __) return; } const state = getState(); const userId = state.auth?.context?.userId; const sessionId = state.session?.context?.id; services.analytics.track({ eventName: action.type, properties: { ...action.payload, userId, sessionId, timestamp: new Date().toISOString(), }, }); } catch (error) { console.error("Analytics tracking error:", error); // Не прерываем основной поток при ошибках аналитики } }, }, });

2. Логирование состояний и переходов

Глобальные эффекты идеально подходят для реализации логирования:

const loggingMachine = createMachine({ config: { IDLE: {}, }, initialState: "IDLE", initialContext: {}, effects: { "*": ({ action, getState }) => { if (process.env.NODE_ENV === "development") { const currentState = getState(); console.group(`📊 Action: ${action.type}`); console.log("Payload:", action.payload); console.log("Current State:", currentState); console.groupEnd(); } }, }, });

3. Мониторинг ошибок

Отслеживание и обработка ошибок на глобальном уровне:

const errorMonitorMachine = createMachine({ config: { IDLE: {}, }, initialState: "IDLE", initialContext: { }, effects: { "*": ({ action, services }) => { // Отправка ошибок в систему мониторинга if (action.type.includes("ERROR") && action.payload?.error) { services.errorMonitoring.captureException(action.payload.error, { tags: { actionType: action.type, }, extra: { payload: action.payload, }, }); } }, }, });

Лучшие практики

  1. Избегайте побочных эффектов: Глобальные эффекты должны быть преимущественно наблюдателями, не влияющими на основной поток.
  2. Обрабатывайте ошибки: Оборачивайте код глобальных эффектов в try-catch, чтобы ошибки не нарушали работу основного приложения.
  3. Используйте для сквозной функциональности: Аналитика, логирование, мониторинг - идеальные кандидаты для глобальных эффектов.
  4. Ограничивайте вызовы переходов: Будьте осторожны с вызовом transition в глобальных эффектах, чтобы избежать бесконечных циклов.
  5. Разделяйте ответственность: Создавайте отдельные автоматы с глобальными эффектами, чтобы сохранить чистоту кода.
  6. Оптимизируйте производительность: Используйте проверки и условия, чтобы выполнять только необходимые операции в глобальных эффектах.
Last updated on