回流如何监听异步操作完成
Reflux how to listen for async action completed
通过阅读文档,我不太了解 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 似乎不是一个函数,所以上面的代码不起作用。正确的做法是什么?
我自己是 Reflux 的新手,这是我整理的一个演示。不确定它是否 100% 正确,但可能会对您有所帮助 - http://jsbin.com/roqito/2/edit
我发现我的原始代码因为一个错字和一个错误而无法运行。以下是更正。
mixins: [State, Navigation, Reflux.listenerMixin],
应该是
mixins: [State, Navigation, Reflux.ListenerMixin],
我相信 React 中已经添加了未定义混合的警告,但显然还没有进入我的版本。
actions.loadProject = Reflux.createAction({
"loadProject": {children: ['completed','failed']},
});
应该是
actions.loadProject = Reflux.createAction({children: ['completed','failed']});
我改用了 createActions 中的语法。这就是 loadProject.completed 不是函数的原因。 Reflux 创造了一个简单的动作,显然没有抱怨。
在 Tim Arney 的示例中,您可以将 API 调用保留在单独的动作侦听器中,并让商店仅侦听已完成的动作。我想我更愿意将 API 调用与存储逻辑一起保留。如果有人认为有充分的理由不这样做,我很想听听。
来自docs:
// Create async action with `completed` & `failed` children
var makeRequest = Reflux.createAction({ asyncResult: true });
通过阅读文档,我不太了解 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 似乎不是一个函数,所以上面的代码不起作用。正确的做法是什么?
我自己是 Reflux 的新手,这是我整理的一个演示。不确定它是否 100% 正确,但可能会对您有所帮助 - http://jsbin.com/roqito/2/edit
我发现我的原始代码因为一个错字和一个错误而无法运行。以下是更正。
mixins: [State, Navigation, Reflux.listenerMixin],
应该是
mixins: [State, Navigation, Reflux.ListenerMixin],
我相信 React 中已经添加了未定义混合的警告,但显然还没有进入我的版本。
actions.loadProject = Reflux.createAction({
"loadProject": {children: ['completed','failed']},
});
应该是
actions.loadProject = Reflux.createAction({children: ['completed','failed']});
我改用了 createActions 中的语法。这就是 loadProject.completed 不是函数的原因。 Reflux 创造了一个简单的动作,显然没有抱怨。
在 Tim Arney 的示例中,您可以将 API 调用保留在单独的动作侦听器中,并让商店仅侦听已完成的动作。我想我更愿意将 API 调用与存储逻辑一起保留。如果有人认为有充分的理由不这样做,我很想听听。
来自docs:
// Create async action with `completed` & `failed` children
var makeRequest = Reflux.createAction({ asyncResult: true });