9

通过阅读文档,我不太了解 Reflux 异步操作是如何工作的。特别是当异步操作完成时,我需要触发一些东西。

在我的一个组件中,我想监听异步操作完成,然后转换到视图。

mixins: [State, Navigation, Reflux.listenerMixin],

componentDidMount() {
  this.listenTo(actions.loadProject.completed, ()=>{this.transitionTo('info')});
},

我已经创建了这样的操作:

var actions = Reflux.createActions([
  "someSyncAction",
  "anotherSyncAction"
]);

actions.loadProject = Reflux.createAction({
  "loadProject": {children: ['completed','failed']},
});

在我的 projectStore 我有这样的东西:

 onLoadProject(id) {

    var url = '/api/projects/' + id;
    io.socket.get(url, (body, jwr) => {

      if(jwr.statusCode !== 200){
        console.error('Failed to load project', id, body);
        return actions.loadProject.failed();
      }

      var p = body;
      debug('loaded project', id, p);
      this.project = p;
      this.trigger(p);
      actions.loadProject.completed();
    });
  },

但似乎 actions.loadProject.completed 不是一个函数,所以上面的代码不起作用。什么是正确的方法?

4

3 回答 3

6

我发现我的原始代码因为一个错字和一个错误而不起作用。以下是更正。

mixins: [State, Navigation, Reflux.listenerMixin],

本来应该

mixins: [State, Navigation, Reflux.ListenerMixin],

我相信未定义的 mixin 的警告已经添加到 React 中,但显然还没有进入我的版本。

actions.loadProject = Reflux.createAction({
 "loadProject": {children: ['completed','failed']},
});

本来应该

actions.loadProject = Reflux.createAction({children: ['completed','failed']});

我改用了 createAction语法。这就是 loadProject.completed 不是函数的原因。回流创造了一个简单的动作,没有明显的抱怨。

在 Tim Arney 的示例中,您可以将 API 调用保存在单独的操作侦听器中,并让商店仅侦听已完成的操作。我想我更喜欢将 API 调用与存储逻辑保持一致。如果有人认为有充分的理由不这样做,我很想听听。

于 2015-02-19T16:33:26.400 回答
1

我自己是 Reflux 的新手,这是我整理的一个演示。不确定它是否 100% 正确但可能对您有所帮助 - http://jsbin.com/roqito/2/edit

于 2015-02-19T15:28:49.863 回答
0

来自文档

// Create async action with `completed` & `failed` children 
var makeRequest = Reflux.createAction({ asyncResult: true });
于 2015-04-08T16:21:30.910 回答