Как обрабатывать асинхронные ошибки во Flux?

Я работал с Flux, и мне это очень нравится, но у меня есть один момент, когда я не могу понять, что будет лучшим решением. Я сделал приложение, которое обрабатывает список заказов, и каждый заказ в списке разделен на разные компоненты, которые могут иметь режим чтения / редактирования (в основном переходя в небольшую форму) и запускать обновление (список товаров в заказе, доставка). расходы и т. д.).

Список заказов Flux

Все работает нормально, за исключением случая, когда мне приходится обрабатывать исключения с сервера при обновлении заказа (например, пользователь изменил одно из количеств продукта, но на складе его недостаточно, я хочу, чтобы компонент показывал форму для этого конкретного продукта для этот конкретный заказ отображает встроенное сообщение, поэтому я должен доставить сообщение об ошибке очень конкретному компоненту. В списке может быть до 50 заказов, и каждый заказ состоит из 4-5 компонентов, которые могут инициировать обновление, поэтому я могу иметь около 200 компонентов, которые могут быть потенциально заинтересованы в действии ORDER_UPDATE_FAILED.

Есть только два варианта:

  1. Сделайте так, чтобы компонент вызывал обновление API синхронно, чтобы он мог извлечь ошибку, если она произошла (обновленный заказ будет отправлен как полезная нагрузка действия ORDER_UPDATED и поддерживать его поток в нормальном потоке потока: диспетчер, хранилище, обновление триггера). Но я знаю, что это немного нарушает философию Flux
  2. Выполните обновление асинхронно и создайте ORDER_UPDATE_FAILED, а также хранилище, имеющее логику для преобразования преобразования в ошибку в объекте, который может быть идентифицирован компонентом части заказа (с точки зрения orderID + errorID). Это позволило бы сохранить однонаправленный цикл данных и асинхронность действий, но это кажется слишком сложным и громоздким и добавляет еще несколько проблем:

    а) Если ошибка хранится в хранилище, компонент должен уведомить хранилище, когда ошибка больше не действительна, что может быть невозможно сделать всегда).

    б) Если пользователь нажимает кнопку "Сохранить", не меняя значения, и компонент переходит в "состояние загрузки", даже если вызов выполнен успешно, порядок остается прежним, поэтому нет необходимости повторно выводить код из "состояния загрузки".

Кто-нибудь нашел более элегантный способ решить эту проблему?

1 ответ

Я думаю, что вариант 1 имеет смысл и им легче управлять, если ошибка имеет значение только в рамках этого компонента. Я использовал этот подход для отображения ошибок при отправке формы для таких вещей, как регистрация пользователя, где я знаю, что единственное место, где мне понадобится сообщение об ошибке, находится непосредственно в форме ("это имя пользователя уже занято"). Я рассматриваю такого рода сообщения об ошибках как часть самой формы / компонента, скорее локальное состояние, чем состояние приложения. Это очень похоже на вашу ситуацию, поэтому я бы сказал, что это лучший вариант.

Вариант 2 был бы более устойчивым к вероятности того, что ошибка может стать актуальной в более чем одном месте в будущем. Но если вы уверены, что это вряд ли произойдет, я не вижу преимущества в повышенной сложности по сравнению с вариантом 1.

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