Отправка дальнейших действий при обработке действий

У меня есть сценарий, в котором я чувствую, что мне нужно отправить действие в ответ на другое действие, и я не знаю, как лучше всего разобраться.

Действие отправляется в ответ на HTTP-ответ, например:

type: 'auth'
data: { username: 'tom' }

Поскольку этот ответ был успешным, я хочу отправить действие, чтобы отправить пользователя на домашнюю страницу:

type: 'navigate'
date: { where: 'home' }

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

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

Я не понимаю, как я мог бы реструктурировать свои магазины, чтобы облегчить это, не запутывая намерения. Мой UserStore знает о auth действиях, а мой RouteStore знает о navigate действиях. Любые предложения о том, как магазины могут быть изменены, чтобы облегчить это, будут оценены.

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

Каков наилучший выход из этого?


person Tom    schedule 14.11.2014    source источник


Ответы (2)


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

Таким образом, в этом случае вы будете реагировать только на «auth» как в UserStore, так и в RouteStore.

person fisherwebdev    schedule 15.11.2014
comment
Спасибо за ответ. Кажется немного странным, что хранилище маршрутов отвечает действиями, но я думаю, что у меня еще не совсем правильное ощущение хранилищ. Я думаю, что именно здесь логика приложения попадает в магазины, что кажется немного неудобным, но опять же, большая часть React/Flux сначала кажется отсталой, а в конце работает намного лучше, чем «по-старому»! - person Tom; 15.11.2014
comment
Я попробую это и приму ответ, если он сработает. Возможно, мне нужно немного перенастроить мой маршрутизатор. - person Tom; 15.11.2014
comment
Хранилища должны содержать почти всю логику вашего приложения, в дополнение к состоянию вашего приложения. Они являются центром всего управления в приложении Flux. Можно провести параллель между хранилищами Flux и идеальными толстыми моделями в некоторых сообществах MVC, таких как Rails. Они толстые, потому что там живет все государство и логика. - person fisherwebdev; 15.11.2014

Вы должны оглянуться назад, как вы пытаетесь создать этот поток.

Вы говорите, что вам нужно создать действие в ответ на другое действие, верно? Итак, давайте назовем это «ActionForwarderStore».

В итоге мы получаем такой поток:

AuthAction --> Dispatcher --+--> UserStore
                            |
                            +--> ActionForwarderStore --+
                                                        |
           +--------------------------------------------+
           |
           +-> Dispatcher -----> RouteStore

Вы видите, что у вас все еще есть кто-то, кто понимает, что AuthAction должен в конечном итоге изменить маршрут? Это ActionForwarderStore. Поскольку Flux предполагает, что каждый Магазин прослушивает каждое действие, это знание о том, что AuthAction завершается изменением маршрута, может попасть прямо в RouteStore. Так:

AuthAction --> Dispatcher --+--> UserStore
                            |
                            +--> RouteStore

Помните, что Flux был «создан» для того, чтобы избежать непредсказуемости MVC. Если вы сохраните все изменения вашего маршрута в RouteStore, вам просто нужно посмотреть на этот код Store, чтобы понять, какие Действия вызовут изменение маршрута. Если вы пойдете по пути создания действия в ответ на другое действие, вы будете знать только то, что NavigateAction меняет маршруты, и вам нужно будет просмотреть другие Магазины, чтобы проверить, какие из них запускают это Действие в ответ на другие.

Это то, что Flux называет «однонаправленным потоком». Таким образом легко обнаружить проблемы, потому что это единственный допустимый поток. Если вы нажмете кнопку, и она изменит маршрут, вы можете точно знать, что действие, отправленное нажатием, вызывает изменение маршрута, каскадных действий нет.

person Thiago Negri    schedule 19.12.2014