Я создаю приложение Flux, используя MartyJS (который довольно близок к «ванильному» Flux и использует тот же базовый диспетчер). Он содержит хранилища с неотъемлемыми отношениями зависимости. Например, UserStore
отслеживает текущего пользователя, а InstanceStore
отслеживает экземпляры данных, принадлежащих текущему пользователю. Данные экземпляра извлекаются из API асинхронно.
Вопрос в том, что делать с состоянием InstanceStore
при изменении пользователя.
Я пришел к выводу (например, прочитав ответы @fisherwebdev на SO), что наиболее целесообразно делать запросы AJAX в функции создателя действия и иметь «успешный» результат AJAX в действии, которое, в свою очередь, приводит к изменению магазинов.
Итак, чтобы получить пользователя (то есть войти в систему), я делаю вызов AJAX в функции создателя действия, и когда он разрешается, я отправляю действие RECEIVE_USER
с пользователем в качестве полезной нагрузки. UserStore
слушает это и соответствующим образом обновляет свое состояние.
Однако мне также нужно повторно получить все данные в InstanceStore
, если пользователь изменился.
Вариант 1: я могу прослушивать RECEIVE_USER
в InstanceStore
и, если это новый пользователь, инициировать запрос AJAX, который, в свою очередь, создает другое действие, которое, в свою очередь, приводит к обновлению InstanceStore
. Проблема в том, что это похоже на каскадные действия, хотя технически это асинхронно, поэтому диспетчер, вероятно, разрешит это.
Вариант 2. Другим способом для InstanceStore
было бы прослушивание событий изменения, генерируемых UserStore
, и затем выполнение танца запрос-действие, но это тоже кажется неправильным.
Вариант 3. Третьим способом для создателя действия может стать организация двух вызовов AJAX и отправка двух действий по отдельности. Однако теперь создатель экшена должен много знать о том, как магазины соотносятся друг с другом.
Один из ответов в Где должен быть сделан запрос ajax в приложении Flux. ? заставляет меня думать, что вариант 1 является правильным, но документы Flux также подразумевают, что хранить триггерные действия нехорошо.