Допустим, у меня есть приложение для управления задачами. Пользователь может добавлять новые задачи, нажимая кнопку.
Когда пользователь нажимает кнопку, появляется счетчик до тех пор, пока задача не будет сохранена в серверной части или запрос не завершится ошибкой.
Когда кнопка нажата, отправляется действие с именем ADD_TODO_REQUEST, которое затем будет перехвачено эпиком, наблюдаемым с редуксом, который выполнит HTTP-запрос для сохранения задачи и отправит ADD_TODO_COMPLETE или действие ADD_TODO_FAILED в зависимости от результата HTTP-запроса.
Приложение должно отображать счетчик рядом с кнопкой "Добавить задачу".
Для этого мое состояние содержит флаг с именем isSaving, который будет установлен в значение true, когда HTTP-запрос ожидает обработки, и будет сбрасывается в false после завершения HTTP-запроса.
Форма моего начального состояния выглядит так:
{
todos: [],
isSaving: false
}
Когда приложение запускается, первое действие, которое будет отправлено, — это FETCH_TODO_REQUEST, которое вызовет другую конечную точку API для получения всех задач.
Приложение снова должно отображать счетчик, информирующий пользователя о том, что задачи загружаются. Для этого я добавил еще один флаг в состояние с именем isFetching.
Этот новый флаг необходим, потому что если бы я использовал один и тот же флаг при добавлении задач, я бы отображал счетчик для всего приложения, когда пользователь просто добавляет задачу.
Форма моего исходного состояния теперь выглядит так:
{
todos: [],
isSaving: false,
isFetching: false
}
Этот подход выглядит хорошо для меня, но если пользователь также может удалять задачи, я должен отслеживать этот дополнительный статус HTTP-запроса, поэтому мне нужно добавить еще один флаг (вероятно, называемый isDeleting) в государство.
Обратите внимание, что я хотел бы показать счетчик рядом с «кнопкой добавления» и один счетчик рядом с каждым удаляемым заданием. Все эти спиннеры могут появляться одновременно, поэтому одного флага недостаточно, и я прибег к этому подходу.
В сценариях, где у меня потенциально может быть много разных параллельных «действий» API, мне потребуется флаг для каждого возможного запроса.
Если бы я также хотел отображать ошибки, мне теперь потребовались бы два свойства для каждого доступного «действия» API: одно для сигнализировать о том, что запрос выполняется, а другой — удерживать объект ошибки.
Проблема с этим подходом в том, что он выглядит очень, очень, многословным.
Есть ли идиоматический и более умный способ отслеживать статус одновременных HTTP-запросов?
Правильно ли иметь флаг для каждого возможного HTTP-запроса, касающегося одного и того же «объекта»?
isDoingSomething
, но тогда все компоненты, использующие этот флаг, будут одновременно отображать состояние загрузки. - person madebydavid   schedule 01.01.2018