Я пытаюсь понять, как разрешать зависимости между магазинами. Проблема в том, что у меня есть полное дерево данных, которое нужно извлекать с сервера с цепочкой запроса, которая зависит друг от друга.Flux: waitFor конкретное событие
ПРОБЛЕМА:waitFor
швов не допускается для асинхронных запросов. Предположим, что следующая цепь событий:
- NEED_A (посмотреть на
StoreA
) - NEED_B (посмотреть на
StoreB
) ЗдесьStoreB
сделатьAppDispatcher.waitFor([StoreA.dispatchToken])
. Но на самом деле мы хотим, чтобы ждатьGET_A
- SOME_OTHER_ACTION (взгляд на
StoreA
)
Третий шаг ломает waitFor
на второй стадии, так как StoreA.dispatchToken
был призван SOME_OTHER_ACTION
.
Вопрос:Что такое истинный путь ждать какой-то конкретного действия (GET_A
)?
Давайте посмотрим на код (пожалуйста, обратите внимание на три PROBLEM
комментарии):
StoreA
var a = [];
var StoreA = assign({}, EventEmitter.prototype, {
getAProps:() => copyOfAProps(a);
asyncGetA:() => ... //Async request returns Promise
});
StoreA.dispatchToken = AppDispatcher.register((action) => {
switch(action.type) {
NEED_A:
StoreA.asyncGetA().then((data) => {
ActionCreator.getA(data); //Dispatches GET_A event
});
break;
GET_A:
a = action.data;
StoreA.emitChange();
SOME_OTHER_ACTION:
//do whatever
}
});
StoreB
var b = [];
var StoreB = assign({}, EventEmitter.prototype, {
// PROBLEM: this request depends on data fetched from StoreA.asyncGetA
asyncGetB: (A) => ...
});
StoreB.dispatchToken = AppDispatcher.register((action) => {
switch(action.type) {
//PROBLEM: NEED_B may happen before GET_A
NEED_B:
//PROBLEM: As I understand waitFor doesn't work here
AppDispatcher.waitFor([StoreA.dispatchToken]);
StoreB.asyncGetB(StoreA.getAProps()).then((data) => {
ActionCreator.getB(data);
});
GET_B:
b = action.data;
StoreB.emitChange();
}
});
Я использую цепочку действий, а не ждать. –
@ JanakaStevens, что вы имеете в виду? Пример pleaseeeee!) –