Flux Dispatch.dispatch(...):无法在调度中间发送

时间:2014-10-27 05:21:48

标签: flux reactjs-flux

我的代码 https://gist.github.com/ButuzGOL/707d1605f63eef55e4af

因此,当我获得登录成功回调时,我想进行重定向,
重定向也通过调度程序工作。

我正在收到Dispatch.dispatch(...):无法在发送过程中发送。

在中间是否有任何黑客行动?

5 个答案:

答案 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({...});
}