Как справиться с композицией и извлечением данных с помощью зависимостей в Flux?

Я пытаюсь выяснить, как лучше всего справиться с довольно распространенной ситуацией в приложениях средней сложности с использованием архитектуры Flux, как получить данные с сервера, когда модели, составляющие данные, имеют зависимости между ними. Например:

Веб-приложение магазина имеет следующие модели:

  • Тележки (у пользователя может быть несколько тележек)
  • Продавцы
  • Товары

С каждой из моделей связан магазин (CartsStore, VendorsStore, ProductsStore).

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

У меня есть иерархия компонентов React.js:

  • CartList.jsx
    • Cart.jsx
      • CartItem.jsx

Компонент CartList извлекает все данные из хранилищ и создает список компонентов корзины, передавая определенные зависимости для каждого из них. (тележки, продавцы, продукты)

Теперь, если бы я знал заранее, какие продукты и поставщики мне нужны, я бы просто запускал все три запроса к серверу и использовал бы waitFor в Магазинах для синхронизации данных, если это необходимо. Проблема в том, что пока я не получу тележки, я не знаю, каких поставщиков или продукты мне нужно запросить на сервере.

Мое текущее решение состоит в том, чтобы обработать это в компоненте CartList, в getState я получаю тележки, продавцов и продукты из каждого из магазинов, а в _onChange я делаю весь поток:

Поток данных

Это работает на данный момент, но есть несколько вещей, которые мне не нравятся:

1) Поток кажется мне немного хрупким, особенно потому, что компонент прослушивает 3 хранилища, но есть только точка входа для запуска «что-то изменилось в событии данных», поэтому я не могу различить, что именно изменилось и правильно реагировать.

2) Когда компонент запускает некоторые из вложенных зависимостей, он не может создать какое-либо действие, потому что находится в методе _onChange, который считает, что все еще обрабатывает предыдущее действие. Flux это не нравится, и он запускает «Невозможно отправить в середине отправки», что означает, что я не могу инициировать какое-либо действие, пока весь процесс не будет завершен.

3) Из-за единственной точки входа достаточно сложно реагировать на ошибки.

Итак, альтернативное решение, о котором я думаю, состоит в том, чтобы иметь логику «композиции модели» в вызове API, иметь модель-оболочку (CartList), содержащую все 3 необходимые модели, и хранить ее в магазине, который будет только получить уведомление, когда весь объект будет собран. Проблема в том, чтобы реагировать на изменения в одной из подмоделей, поступающие извне.

Кто-нибудь нашел хороший способ справиться с ситуациями с компоновкой данных?


person jasalguero    schedule 10.04.2015    source источник


Ответы (1)


Не уверен, что это возможно в вашем приложении или правильно, но у меня был похожий сценарий, и в итоге мы сделали псевдореализацию Relay/GraphQL, которая в основном дает вам все дерево при каждом запросе. Если данных много, это может быть сложно, но мы просто выяснили зависимости и т. д. на стороне сервера, а затем вернули их в удобном иерархическом формате, чтобы компоненты React имели все необходимое вплоть до уровня, с которого поступил вызов. .

Как я уже сказал, в зависимости от деталей это может быть неосуществимо, но мы обнаружили, что гораздо проще разобраться с этими зависимостями на стороне сервера с помощью таких вещей, как SQL/Java, а не, как вы упомянули, делать множество асинхронных вызовов и возиться с магазины.

person SleepyProgrammer    schedule 13.04.2015
comment
Я согласен, но моя проблема в том, что у меня нет контроля над API обслуживания, и он обрабатывает только базовые модели. Я закончил тем, что сделал композицию в API, и на данный момент работает хорошо. Просто нужно быть осторожным с обновлениями, чтобы запускать перезагрузку зависимостей только при необходимости. - person jasalguero; 16.04.2015
comment
Реализация технологии, которую мало кто видел, Relay/GraphQL — модные словечки на Facebook, не является решением ничьей проблемы. - person ; 10.05.2015
comment
Извините, но я немного не согласен @Rollo Хотя подробностей реализации не было, Relay/GraphQL довольно хорошо определен концептуально. Возможно, моя ссылка на них не была хорошим выбором, но идея позволить компоненту самого низкого уровня в иерархии запрашивать все дерево данных, необходимое для представления приложения до этого уровня, кажется мне довольно разумным решением. - person SleepyProgrammer; 11.05.2015
comment
Ну если вам помогло, то вам вся сила. Но если у вас есть плоский API, я думаю, что лучше иметь инкапсулированные компоненты, которые выполняют свои собственные действия для извлечения данных, это лучше работает с тем, что уже существует. Relay/GraphQL — непростой шаблон для реализации. - person ; 11.05.2015
comment
Не беспокойтесь вообще, это ценная дискуссия, поэтому я рад, что вы снова привлекли к ней наше внимание... определенно все еще интересная проблема, и я согласен, что важно не прыгать на подножку до того, как она покинет станцию ​​(в с уважением к GraphQL/Relay): P. Ваше здоровье! - person SleepyProgrammer; 11.05.2015