Flux waitFor () и асинхронная операция, как моделировать.
Я использую pouchDB в качестве локальной базы данных для приложения. Я хочу запросить результаты из PouchDB и загрузить это в React.js. Однако, хотя я использую метод waitFor (), результаты запроса PouchDB возвращаются слишком поздно. Я думаю, я не понимаю правильное использование waitFor (), может быть, кто-то может пролить свет на это.
У меня есть два хранилища, 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, которая загружает файлы БД в массив _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;
});
В response.js функция getInitialState будет вызывать функцию getFiles () из FileExplorerStore для отображения файлов.
Как я могу исправить это или смоделировать это лучше?