← Назад к вопросам

Что такое allSettled в Effector?

2.0 Middle🔥 41 комментариев
#State Management

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Обзор allSettled в Effector

В библиотеке Effector, функция allSettled является ключевым инструментом для управления процессом завершения работы store, event или effect. Она позволяет дождаться завершения всех текущих операций и обновлений состояния, что особенно важно в тестировании, SSR (Server-Side Rendering) и других сценариях, требующих гарантированной финализации состояния.

Основная цель и использование

allSettled возвращает Promise, который разрешается только после того, все текущие обновления и вычисления в указанных сущностях Effector полностью завершены. Это включает:

  • Обработку всех вызовов events и их side effects.
  • Выполнение всех effects и их асинхронных операций.
  • Финализацию всех зависимых stores после всех обновлений.

Используется преимущественно в двух контекстах:

  1. Тестирование: для гарантии, что состояние приложения стабилизировалось перед проверкой ожидаемых значений.
  2. SSR: чтобы дождаться завершения всех асинхронных операций (например, запросов данных) перед рендерингом финального HTML.

Пример использования

Рассмотрим пример с тестированием асинхронного эффекта:

import { createEffect, createStore, allSettled } from 'effector';

// Создаем эффект для имитации API запроса
const fetchUserFx = createEffect(async (userId) => {
  const response = await fetch(`/api/users/${userId}`);
  return response.json();
});

// Создаем store для данных пользователя
const $user = createStore(null).on(fetchUserFx.doneData, (_, user) => user);

// Тест с использованием allSettled
describe('fetchUserFx', () => {
  it('should update $user store after effect completion', async () => {
    // Диспатчим эффект с параметром
    fetchUserFx(1);
    
    // Ждем завершения всех операций
    await allSettled(fetchUserFx);
    
    // Проверяем, что store обновился ожидаемым значением
    expect($user.getState()).toEqual({ id: 1, name: 'John Doe' });
  });
});

Ключевые особенности и внутренняя работа

  • Возвращает Promise: allSettled всегда возвращает Promise<void>, который разрешается после финализации.
  • Принимает сущность: Можно передать конкретный event, store или effect, чтобы дождаться завершения именно связанных с ним операций.
  • Глобальное завершение: Если не передать аргумент, функция ждет завершения всех текущих операций во всей системе Effector (используется реже, так как может приводить к неожиданным зависимостям).
  • Используется с fork: В SSR часто используется в комбинации с fork API Effector для создания изолированных экземпляров состояния на сервере.

Практические сценарии применения

  1. Тестирование сложных асинхронных потоков: Когда тест включает последовательность событий и эффектов, allSettled гарантирует, что все side effects завершились перед проверкой состояния.

  2. Интеграция с SSR в Next.js или аналогичных фреймворках:

// Пример для Next.js getServerSideProps
export const getServerSideProps = async () => {
  const scope = fork(); // Создаем изолированный scope
  
  // Диспатчим события для начальной загрузки данных
  somePageLoadedEvent();
  
  // Ждем завершения всех эффектов (например, запросов к API)
  await allSettled(somePageLoadedEvent, { scope });
  
  // Сериализуем состояние для передачи клиенту
  const serialized = serialize(scope);
  
  return { props: { initialState: serialized } };
};
  1. Обеспечение стабильности в E2E тестах: В Cypress или Playwright можно использовать allSettled для ожидания завершения внутренних состояний Effector перед переходом к следующему шагу теста.

Отличия от watch и других методов

  • watch используется для реакции на изменения, но не гарантирует ожидание завершения всех связанных процессов.
  • allSettled специально создана для синхронизации и ожидания, что делает её уникальной для контроля завершения операций.

Резюме

allSettled в Effector — это мощный инструмент для синхронизации и контроля завершения асинхронных операций и обновлений состояния. Его использование критически важно для:

  • Надежного тестирования асинхронного поведения.
  • Корректной реализации SSR с предзагрузкой данных.
  • Гарантии стабильности состояния в сложных сценариях.

Правильное применение allSettled позволяет избежать race conditions и непредсказуемого поведения, обеспечивая четкий контроль над потоком обновлений в приложениях, построенных на Effector.

Что такое allSettled в Effector? | PrepBro