В моей реакции родное приложение, которое отслеживает инструмент практики у меня есть три магазина:Круговые зависимостей модуля между магазинами
- SessionStore
- GoalStore
- InstrumentStore
хранит каждый управлять одной модели (Сеанс, цель, инструмент) и получение/обновление сервера с помощью REST api.
SessionStore прослушивает действия, касающиеся сеансов (очевидно): session.add, session.update. Но он также прослушивает изменения в других магазинах, чтобы иметь возможность обновлять сеансы, если имя цели или инструмента изменено.
Соответственно, InstrumentStore прислушивается к действиям инструмента, а также к действиям сеанса для обновления статистики о том, сколько сеансов использует конкретный инструмент.
Чтобы иметь возможность не иметь условий гонки, InstrumentStore будет действовать на action session.add, но дождаться, когда SessionStore обработает действие первым (чтобы гарантировать, что Session был обновлен в API). Для этого я использую dispatcher.waitFor с SessionStore dispatchToken как семафор.
Проблема: поскольку все магазины используют друг друга dispatchTokens, все они должны импортировать друг друга. Это круговая зависимость от модулей и приводит к странным условиям гонки. Иногда один из магазинов не был построен, когда он входит в один из других магазинов.
Вот мои магазины: https://github.com/osirisguitar/GuitarJournalApp/tree/feature/flat-ui/js/stores
Могу ли я с помощью потока шаблона неправильного пути?
Добавление
Это то, что я хочу, чтобы это произошло (в последовательности):
Session обновляется:
- Отправить обновленный сеансовый API
- Обновить SessionStore
- Обновить GoalStore
- Обновить InstrumentStore
2, 3 и 4 нужно дождаться завершения 1, поэтому для GoalStore и InstrumentStore нужен токен отправки SessionStore.
Цель является обновление:
- Отправить обновленный цель API
- Обновить GoalStore
- Обновить SessionStore
2 и 3 нужно ждать 1, поэтому SessionStore нуждается GoalStore dispatchToken, который вводит круговую зависимость.
Вы правы, GoalStore не должен говорить SessionStore.refresh() (и emitchange), он должен сказать GoalStore.refresh(). Но мне все еще нужно, чтобы SessionStore dispatchToken смог дождаться завершения SessionStore, прежде чем GoalStore сможет обновить ... Я обновляю исходный вопрос с потоком, чтобы сделать его более понятным. –
Да, это очень верно - бит ошибки новичка javascript там (не понял, что я назначал функцию). Я думаю, используя getDispatchToken() в диспетчеризации вместо того, чтобы пытаться получить его во время объявления, решит его - спасибо! –
На самом деле, я беру это обратно. dispatcher.register Возвращает диспетчер отправки (https://facebook.github.io/flux/docs/dispatcher.html). Итак, что я сделал, это реализовать свой собственный getDispatchToken, вместо того, чтобы использовать его из flux utils.В любом случае, спасибо за то, что вызвали меня по правильному пути :-) –