У меня есть приложение, которое использует sync API для получения своих данных и требует хранения всех данных локально. Сам набор данных очень велик, и я не хочу хранить его в памяти, так как он может содержать тысячи записей. Поскольку я не думаю, что фактическая структура данных имеет значение, позвольте предположить, что я создаю почтовый клиент, который должен быть доступен в автономном режиме, и что я хочу, чтобы мой механизм хранения был IndexedDB (который является асинхронным).
Я знаю, что простым решением было бы не иметь структуру данных как часть моего объекта состояния и заполнять состояние только необходимыми данными (например, хранить содержимое электронной почты в состоянии, когда срабатывает действие EMAIL_OPEN). Это довольно просто, особенно с сокращением.
Однако это означало бы, что мне нужно поставить под угрозу 2 вещи:
- Пользовательские данные больше не являются частью "состояния приложения", хотя на самом деле это так. Поскольку поведение синхронизации является сложным, и удаление его из конечного автомата приложения может повредить элегантность концепций redux (как я их понимаю).
- Мне очень нравится архитектура redux и хотелось бы, чтобы вся моя логика прошла через нее, а не только состояние представления.
Есть ли какие-либо рекомендации по использованию сокращений с свойствами состояния не в памяти? То, что мне больше всего сложно оборачивать, заключается в том, что redux использует синхронные API-интерфейсы, поэтому я не могу заменить свой объект состояния объектом состояния async (если я полностью не удалю редукцию и не заменим его собственной, асинхронной реализацией и коннектором).
Я не мог найти ответ с помощью Google, но если у вас уже есть хорошие ресурсы по этому вопросу, я бы тоже хотел отметить.
UPDATE: На вопрос ответили, но он хотел дать лучшее объяснение тому, как я его реализовал, если кто-то столкнется с ним:
Основная идея состоит в том, чтобы поддерживать списки изменений как клиента, так и сервера с помощью просто сокращающих редукторов и использовать соединитель для прослушивания этих списков изменений для обновления IDB, а также для обновления сервера с изменениями клиента:
- Когда клиент вносит изменения, используйте редукторы для обновления списка изменений клиента.
- Когда сервер отправляет обновления, используйте редукторы для обновления списка изменений сервера.
- Коннектор прослушивает сохранение, а при обновлении состояния обновляет IDB. Также поддерживайте внутренний список элементов, которые были изменены.
- При обновлении сервера используйте список измененных элементов, чтобы вывести дельта из IDB и отправить серверу.
- При доступе к данным используйте обычные действия, чтобы вытащить из IDB (например, с помощью сокращения),
Единственное предостережение в этом подходе состоит в том, что, поскольку реальное состояние хранится в IDB, поэтому мы теряем часть значения одного объекта состояния (а также более сложного состояния перемотки/перемотки вперед)