Я использую pouchDB как локальную базу данных для приложения. Я хочу запросить результаты из PouchDB и загрузить его в React.js. Однако, хотя я использую метод waitFor(), результаты запроса PouchDB возвращаются слишком поздно. Я думаю, что я не понимаю, как правильно использовать waitFor(), может быть, кто-то может пролить свет на него.Flux waitFor() и операция async, как моделировать.
У меня есть два магазина, DbStore, который извлекает данные из базы данных. И FileExplorerStore этот магазин используется моими реактивными компонентами.
DbStore.dispatchToken = AppDispatcher.register(function (payload) {
var action = payload.action;
var folder = payload.action.folder
switch (action.type) {
case 'OPEN_FOLDER':
if (folder === 'start') {
DbStore.init();
}
else {
DbStore.createPath(folder);
}
DbStore.emitChange();
break;
default:
// do nothing
}
return true;
});
У DbStore есть функция LoadFiles, которая будет загружать файлы DB в массив _files. Для наглядности я скопировал код ниже:
loadFiles: function (_path) {
var fileNames = fs.readdirSync(_path);
_files = [];
fileNames.forEach(function (file) {
console.log(file)
db.query(function (doc) {
emit(doc.name);
}, {key: "bower.json"}).then(function (res) {
_files.push(res.rows[0].key)
});
});
},
FileExplorerStore был метод для извлечения файлов из массива _FILES. Затем в FileExplorerStore у меня есть метод getFiles(), который будет извлекать эти файлы. Однако этот массив всегда пуст, потому что этот метод будет выполнен до заполнения массива.
FileExplorerStore
FileExplorerStore.dispatchToken = AppDispatcher.register(function (payload) {
var action = payload.action;
switch (action.type) {
case 'OPEN_FOLDER':
AppDispatcher.waitFor([DbStore.dispatchToken]);
FileExplorerStore.emitChange();
break;
default:
// do nothing
}
return true;
});
В react.js функция getInitialState будет вызывать GetFiles() функция от FileExplorerStore для отображения файлов.
Как я могу исправить это или смоделировать это лучше?
Спасибо. Кажется, что ваше объяснение - правильный способ моделирования этого. Я также проверил IRC#reactjs, и они также советуют вызывать действие в моем обратном вызове async fetch. Однако я изменил на Reflux, потому что в Reflux я могу вызвать свой API-интерфейс базы данных из Actions, а после того, как данные будут получены, выполните следующее действие. – swennemen
@ChinKang вы можете посмотреть здесь http://stackoverflow.com/questions/32537568/flux-waitfor-specific-event –