Поток: ожидание определенного события
Я пытаюсь понять, как разрешить зависимости между магазинами. Проблема в том, что у меня есть всеобъемлющее дерево данных, которое нужно получать с сервера с цепочкой запросов, которые зависят друг от друга.
ПРОБЛЕМА: waitFor
швы не должны быть предназначены для асинхронных запросов. Предположим, следующая цепочка событий:
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();
}
});