В refluxjs мы решаем waitFor
несколькими способами: один для последовательного потока данных, а другой для параллельного. поток данных. Я пытаюсь смоделировать хранилища данных таким образом, чтобы избежать хранения одних и тех же данных (т. е. двойных данных обслуживания).
По сути, хранилища данных — это компоненты CQRS, и я стараюсь избегать того, чтобы два хранилища данных в конечном итоге содержали одинаковые данные. Если мне нужно каким-то образом преобразовать данные, которые нужны только некоторым компонентам, я разбиваю их на «агрегированное» хранилище данных. Наивная реализация:
var carsStore = Reflux.createStore({
init: function() {
this.listenTo(Actions.updateCars, this.updateCallback);
},
updateCallback: function() {
$.ajax('/api/cars', {}).done(function(data) {
this.trigger(data.cars);
}.bind(this));
}
});
Мы можем создать еще одно хранилище данных, которое агрегирует данные, прослушивая carsStore
:
var modelsStore = Reflux.createStore({
init: function() {
this.listenTo(carsStore, this.carsCallback);
},
carsCallback: function(cars) { // passed on from carsStore trigger
this.trigger(this.getModels(cars)); // pass on the models
}
getModels: function(cars) {
return _.unique(_.map(cars, function(car) { return car.model; }));
}
});
Таким образом, ваши компоненты представления React могут использовать один для получения автомобилей, а другой — для получения моделей, которые собираются из файла carStore
.
Если магазину необходимо дождаться завершения двух параллельных потоков данных, мы предоставляем Reflux.all
для объединения действий и хранилищ. Это полезно, например. если вы ожидаете загрузки данных из разных ресурсов REST.
var carsAndPartsAreLoaded = Reflux.all(carStore, partsStore);
// you may now listen to carsAndPartsAreLoaded
// from your data stores and components
Надеюсь, это имеет смысл для вас.
person
Spoike
schedule
11.08.2014