2014-12-15 3 views
7

В a previous question Я спросил, кто несет ответственность за отправку обновлений на сервер в приложении Flux. Люди сказали мне, что Действия должны это сделать. Поэтому я предполагаю, что то же самое относится к извлечению данных с сервера; у вас есть действие FetchData, которое извлекает данные и отправляет данные для хранилища. Но в таком случае, как будет работать логика кэширования?Где должна кэшировать логику в приложении потока?

Я думаю, что мне нужно было сохранить последний раз, когда был запрошен список, а TTL в списке StreamsStore и действие fetchStreams будут получать TTL и последнее время выборки, чтобы определить, нужно ли проконсультироваться с сервером.

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

ответ

5

Это отличный вопрос и тот, с которым я столкнулся и раньше.

Помните, что самое важное в Flux - это то, что данных в одну сторону, всегда. Вы уже знаете это - я поднимаю его, потому что одно заявление имеет много разъясняющих полномочий и почти полностью отвечает на любой вопрос, который может возникнуть у Flux.

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

Итак, какая часть приложения Flux получает данные из магазинов? просмотров. Вот ваш ответ.

Идея ваших взглядов, имеющих логику кэширования может чувствовать себя странно, но думать о том, что кэширование:

  1. Мне нужны некоторые данные.
  2. У меня уже есть эти данные? Если нет ...
  3. Пойдемте.

Просмотров ручка # 1. Это довольно просто. И № 3, очевидно, обрабатывается вашими действиями. Но, оказывается, №2, по крайней мере, в приложении Flux, также есть что-то, что должно быть рассмотрено в ваших представлениях, или, точнее, ваши -view-view. Представления контроллера являются часто забытой частью Flux, вероятно, потому, что идея контроллеров настолько сильно связана с MVC. Но у Flux есть и их! С Flux сайта:

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

Предполагая, что вы используете React, эта идея должна звучать знакомо. Компоненты реакций более высокого уровня являются контроллерами-y, а компоненты нижнего уровня более «чисты».

Другой способ думать об этом - отметить, что действия - это просто помощники диспетчера. (Если я правильно помню, когда Facebook впервые представил Flux, они даже не упомянули о действиях.) К тому времени, когда вы вызвали действие, вы уже приняли решение отправить: единственный вопрос: что, а не если.

Читая эту спину, я понимаю, что все это может показаться различием без различий, но основным выводом является то, что никакие действия не могут проверить состояние магазина. Они могут общаться с ними только через диспетчера. Вы можете найти способ заставить его работать на практике (что нельзя сбрасывать со счетов!), Но это не идиоматический Flux.

Надеюсь, это имеет смысл!

+2

Это, кажется, имеет смысл на высоком уровне, но тогда, если у вас есть много компонентов, которые имеют общий магазин? Вы предлагаете реплицировать эту логику типа кэширования в каждом отдельном компоненте? Для меня это тоже не имеет смысла. – eipark

+0

Если все ваши компоненты выполняют эту же логику кэширования, вы можете захотеть перепроектировать ваши компоненты. Возможно, у базового компонента есть такая логика, что все остальные компоненты, которые полагаются на этот магазин, расширяются. – TheOneWhoPrograms