Sto utilizzando pouchDB come database locale per un'app. Voglio interrogare i risultati di PouchDB e caricarli in React.js. Tuttavia, anche se sto usando il metodo waitFor(), i risultati della query PouchDB ritornano troppo tardi. Penso di non capire l'uso di waitFor() corretto, forse qualcuno può far luce su di esso.Flux waitFor() e operazione asincrona, come modellare.
Ho due negozi, il DbStore che recupera i dati dal database. E FileExplorerStore questo negozio è usato dai miei componenti di reazione.
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 ha una funzione LoadFiles che carica i file DB nell'array _files. A scopo illustrativo Ho copiato il codice qui sotto:
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)
});
});
},
Il FileExplorerStore aveva un metodo per recuperare i file dalla matrice _files. Quindi in FileExplorerStore ho un metodo getFiles(), che recupererà questi file. Tuttavia, questo array è sempre vuoto poiché questo metodo verrà eseguito prima che l'array venga riempito.
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;
});
Nel react.js la funzione getInitialState chiamerà i GetFiles funzione() dal FileExplorerStore per visualizzare i file.
Come posso risolvere questo o modellare questo in un modo migliore?
Grazie. Sembra che la tua spiegazione sia il modo giusto per modellarlo. Ho anche controllato l'IRC#reactjs e mi hanno anche consigliato di richiamare un'azione nel mio callback di recupero asincrono. Ho comunque cambiato in Reflux perché in Reflux posso chiamare la mia API Database da Actions e dopo che i dati sono stati scaricati, esegui l'azione successiva. – swennemen
@ChinKang potresti guardare qui http://stackoverflow.com/questions/32537568/flux-waitfor-specific-event –