Reactjs Flux waitFor()和异步操作,如何建模。

Reactjs Flux waitFor()和异步操作,如何建模。,reactjs,pouchdb,reactjs-flux,Reactjs,Pouchdb,Reactjs Flux,我正在使用PockDB作为应用程序的本地数据库。我想从PockDB查询结果并将其加载到React.js中。然而,即使我使用waitFor()方法,PockDB查询的结果返回得太晚了。我想我不明白waitFor()的用法,也许有人能解释一下 我有两个存储,DbStore从数据库检索数据。我的react组件使用此存储的FileExplorer存储 DbStore.dispatchToken = AppDispatcher.register(function (payload) { var

我正在使用PockDB作为应用程序的本地数据库。我想从PockDB查询结果并将其加载到React.js中。然而,即使我使用waitFor()方法,PockDB查询的结果返回得太晚了。我想我不明白waitFor()的用法,也许有人能解释一下

我有两个存储,DbStore从数据库检索数据。我的react组件使用此存储的FileExplorer存储

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函数将从FileExplorer存储调用getFiles()函数以显示文件


我如何才能更好地解决这个问题或对其进行建模?

Facebook团队发布的
dispatcher
中的
waitFor
不是为此而设计的(至少是2014年9月11日发布的),它只是确保执行并返回
DispatcheToken
(传递给
waitFor
),然后它将开始执行下一个注册回调

所以在你的情况下,这是正确的预期行为


我要做的是把这个动作分成两部分。第一个是抓取,第二个是在
FileExplorerStore
中打开文件夹。假设DBfetch操作名为
DB\u FETCH
,这将触发数据库,然后将数据获取到
\u文件中
,在FETCH success回调中,触发
操作
OPEN\u文件夹
。对于触发点,这取决于您希望如何设计它,我将使用名为
INIT_OPEN_FOLDER
的第三个操作触发DB_FETCH,然后向UI显示加载指示器,最后在从
OPEN_FOLDER
获取emit时,仅显示数据,谢谢。看来你的解释是正确的建模方法。我还检查了#reactjs IRC,他们还建议在我的异步获取回调中调用一个操作。不过,我确实改为了Reflow,因为在Reflow中,我可以从Actions调用我的数据库API,在获取数据后执行下一个操作。@ChinKang请看这里