Flux waitFor()和异步操作,如何建模。
我正在将pouchDB用作应用程序的本地数据库。我想从PouchDB查询结果并将其加载到React.js中。但是,即使我使用waitFor()方法,PouchDB查询的结果返回也为时已晚。我认为我不正确地使用waitFor(),也许有人可以对此有所了解。
我有两个商店,即DbStore,它从datbase检索数据。我的react组件使用了这个存储的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函数将从FileExplorerStore调用getFiles()函数以显示文件。
如何解决此问题或以更好的方式对此建模?
回答:
该waitFor
在dispatcher
通过Facebook的团队发布没有设计为(至少在2014年9月11日发布),它只是确保dispatchToken
(其中传递到waitFor
)被执行并返回,然后就会开始执行下一个注册的回调。
因此,就您而言,这是正确的预期行为。
我要做的是将动作分为两部分。首先是获取,其次是OPEN_FOLDER
中FileExplorerStore
。假设命名的dbfetch行动DB_FETCH
,这将触发你的数据库,然后将数据进入_files
,在获取成功的回调,引发action
的OPEN_FOLDER
。对于触发点,这取决于您要如何设计,我将命名为第三个动作INIT_OPEN_FOLDER
来触发DB_FETCH,然后将加载指示符显示到UI,最后在从获取发射时OPEN_FOLDER
,仅显示数据
以上是 Flux waitFor()和异步操作,如何建模。 的全部内容, 来源链接: utcz.com/qa/402383.html