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

But*_*GOL 20 flux reactjs-flux

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

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

而且我得到的是Dispatch.dispatch(...):无法在发送过程中发送.

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

fis*_*dev 27

我没有看到你发布的要点在哪里进行重定向.我只看到AUTH_SIGNIN和AUTH_SIGNIN_SUCCESS动作,它们看起来非常简单.

但不,没有黑客可以在调度过程中创建一个动作,这是设计的.行动不应该是引起变化的事情.它们应该像报纸一样通知应用程序外部世界的变化,然后应用程序响应该新闻.商店本身会引起变化.行动告诉他们.

如果您有此错误,则需要备份并查看您是如何处理原始操作的.通常,您可以设置应用程序以响应原始操作,完成您需要执行的所有操作,并避免尝试创建第二个操作.

  • 实际上,例如组件A创建一个更改组件C正在侦听的存储B的操作,并且作为响应,组件C需要从服务器获取数据,这是一个动作,但调度程序仍在调度,因此它不能.解决这个问题对我来说非常讨厌(将获取操作包装在setTimeout或类似的中) (20认同)
  • 组件不应该决定何时获取数据.这是视图层中的应用程序逻辑.此逻辑属于商店,它可以触发XHR,然后错误/成功回调创建具有新数据的操作. (3认同)
  • Flux中的单向数据流是Action-> Dispatcher-> Store-> View.我绘制的循环图(您正在引用)仅用于显示客户端交互.在Flux应用程序*中,数据流仍然是单向的*.发布XHR时,数据已离开系统.数据随响应进入系统.只要您在响应中创建操作而不直接在存储中处理它,就可以保留单向流. (3认同)
  • @fisherwebdev这个问题困扰了我很长一段时间,我想在组件渲染后触发一个动作,例如,在我的视图层,我有一个模态对话框,用于创建一个项目,我触发一个动作来保存项目并且操作通知商店它已经完成了它的工作,然后存储emitchange以触发将关闭对话框的渲染,但我想在组件渲染后重新加载数据,最好处理的是什么?目前我使用setTimeout在它发出change后在商店中触发重载动作,但它看起来很脏.有什么建议吗? (3认同)
  • 组件不是获取任何数据,而是触发一个动作...并且存储触发动作实际上会破坏单向数据流,因为它变成了这样的http://pastebin.com/wrWQdFz1 (2认同)

Wil*_*cio 6

您可以通过"安排"下一个操作而不是直接调用它来使其工作,这是一个示例代码:

// instead of doing this
Dispatcher.dispatch(...);

// go like this
setTimeout(function() {
  Dispatcher.dispatch(...);
}, 1);
Run Code Online (Sandbox Code Playgroud)

这将导致您的下一个调度稍后在当前调度过程中调用,并且不会发生错误.

如果您的调度代码在回调中,那么任何类型的其他异步操作也将起作用(例如,在Ajax请求的响应中).

我正在使用这种风格使一些表格在这里响应通用数据而且我没有遇到任何问题,至少我正在使用它.

  • @DanOsborne我不认为promises在这里解决任何问题,因为它们不会像`setTimeout`那样自动结束当前的执行线程.如果我误解了,你能发一个例子吗?谢谢! (4认同)
  • uuughhh - setTimeout黑客很可怕.更好地使用承诺 (2认同)