Как выполнять зависимые асинхронные вызовы в redux?

Фон

У меня есть приложение для реагирования, которое использует redux и redux-thunk.

Пытаюсь понять, как организовать асинхронные вызовы. Как отправлять действия, только если ранее отправленное действие (вызов API) было успешным.

Вариант использования

У меня есть EmployeesComponent. Этот компонент состоит из двух фиктивных презентационных компонентов.

  • EmployeesList, который в основном перечисляет сотрудников.
  • AddEmployeeForm - модальное окно для добавления новых сотрудников.

При рендеринге компонента EmployeesComponent в хуке useEffect я отправляю действие для загрузки сотрудников. Все идет нормально.

Когда я пользователь вводит данные в AddEmployeeForm и отправляет форму, я хочу снова загрузить всех сотрудников, если вызов API был успешным.

У меня проблемы с пониманием того, как узнать, могу ли я отправить действие для загрузки всех сотрудников. Вот как выглядит мой обработчик отправки.

         const handleSubmit = async (e) => {
        e.preventDefault();
    
        console.log("Handle submit add new employee..");
    
        const employeeData = inputs;
        // Validate data from the AddEmployeeForm
        // in case of validation errors, abort



       dispatch(addEmployee(employeeData)); // calls API to save the data

       // How to await the result of the dispatched action (addEmployee) before continuing? 

       // If addEmployee was not successful abort
       // The error data from the API call is saved in the redux store, 
       // so the UI gets notified and can display it properly

        // If addEmployee was successful, I want to
        clearForm(); // local state from the component
        handleCloseForm(); // local state from the component

        dispatch(loadEmployees());
      };

Вызовы

Текущий подход в handleSubmit мне неприятен. Бизнес-логика как бы помещена в пользовательский интерфейс, и преимущества четкого разделения пользовательского интерфейса и бизнес-логики теряются. Мне сложно понять, каков подход и как справляться с этими вариантами использования.

Другой пример использования:

  • отправка логина пользователя
  • если вход был успешным, вы получите токен из бэкэнда
  • если вход был успешным, отправьте действие для загрузки пользовательских данных на основе полученного токена

1 ответ

В Redux асинхронная логика обычно записывается в виде «переходных» функций . Это позволяет вам извлекать логику, которая должна взаимодействовать с хранилищем за пределами ваших компонентов React, особенно асинхронную логику, которая должна делать такие вещи, как выборка данных и отправка результатов.

Вы также можете вернуть обещание из преобразователя и дождаться этого обещания в компоненте после отправки.

Другие вопросы по тегам