我的代码 https://gist.github.com/ButuzGOL/707d1605f63eef55e4af
因此,当我获得登录成功回调时,我想进行重定向,
重定向也通过调度程序工作。
我正在收到Dispatch.dispatch(...):无法在发送过程中发送。
在中间是否有任何黑客行动?
答案 0 :(得分:27)
我不知道你发布的要点在哪里进行重定向。我只看到AUTH_SIGNIN和AUTH_SIGNIN_SUCCESS动作,它们看起来非常简单。
但不,没有黑客在发送过程中创建一个动作,这是设计的。行动不应该是引起变化的事情。它们应该像报纸一样通知应用程序外部世界的变化,然后应用程序响应该新闻。商店本身会引起变化。行动告诉他们。
如果您遇到此错误,则需要备份并查看您是如何处理原始操作的。大多数情况下,您可以设置应用程序以响应原始操作,完成您需要执行的所有操作,并避免尝试创建第二个操作。
答案 1 :(得分:6)
你可以通过" schedule"下一个动作而不是直接调用它,这是一个示例代码:
// instead of doing this
Dispatcher.dispatch(...);
// go like this
setTimeout(function() {
Dispatcher.dispatch(...);
}, 1);
这将导致您的下一个调度稍后在当前调度过程中调用,并且不会发生错误。
如果您的调度代码在回调中,那么任何其他异步操作也会起作用(例如在Ajax请求的响应中)。
我使用这种风格使某些表单在这里回应通用数据,而且我没有遇到任何问题,至少我使用它的方式。
答案 2 :(得分:1)
去抖是一个更好的解决方案:
var _ = require('lodash');
var CHANGE_EVENT = "change";
var ApplicationStore = _.extend({}, EventEmitter.prototype, {
emitChange: function() {
this.emit(CHANGE_EVENT);
},
addChangeListener: function(callback) {
this.on(CHANGE_EVENT, _.debounce(callback, 100));
},
removeChangeListener: function(callback) {
this.removeListener(CHANGE_EVENT, callback);
},
getState: function(){
return {
showConsole: _showConsole
}
}
});
答案 3 :(得分:-1)
您可以使用"延迟"调度员中的选项。 在你的情况下,它会像:
Dispatcher.dispatch.defer(...);
答案 4 :(得分:-1)
您可以检查调度员是否正在调度,例如:
if(!MyDispatcher.isDispatching()) {
MyDispatcher.dispatch({...});
}