在侦听器回调后调用操作并且...无法在调度中间调度?

Posted

技术标签:

【中文标题】在侦听器回调后调用操作并且...无法在调度中间调度?【英文标题】:Call action after callback from listener and... cannot dispatch in the middle of dispatch? 【发布时间】:2016-04-20 06:26:15 【问题描述】:

我在使用 React 和 Flux 时遇到了麻烦...我们有一个与新的 Flux 聊天示例非常相似的应用程序。我们有著名的错误“在调度过程中无法调度”。但是,在某些情况下,我们很难想出一个好的方法来解决这个问题。

我们的疑问与此相同:https://groups.google.com/forum/#!topic/reactjs/mVbO3H1rICw,但我不能很好地理解所采用的解决方案。据我了解,这不是一个非常优雅的解决方案。

这是事件的顺序:

    动作 A 已调度;

    Store 更新其内部状态并发出更改消息;

    React 组件 X 接收到更改消息(通过侦听器的回调)并更新其状态(setState);

    组件 X 渲染,作为其中的一部分,新组件 Y 也被安装。我们使用状态信息选择要渲染的组件(Y、Z等);

    新组件 Y 需要显示最初未加载的数据。所以我们在组件 Y 的 componentDidMount() 中调用了一个 API,它调用了一个动作 B。

然后,使用 Action B 中的新调度程序,我们会遇到这个调度错误。

如果你认为我们的应用逻辑有问题,我可以举一些实际的例子来说明为什么这种场景对我们来说很常见。任何关于如何重构这种“通量”的想法都非常受欢迎。

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我认为您需要在启动操作 b 之前使用调度程序中的 waitFor 令牌(您使用的是来自 flux npm 模块的调度程序,对吗?)。此外,如果您总是需要来自操作 b 的数据,那么您可以在操作 A 期间从您的商店进行 ajax 调用。

solution b would look like this in /* store.js */

Dispatcher.register(function(payload)
  switch payload.type 
    case ACTION_A:
      /* do your state logic */
      StoreDataAccessLayer.apiCall()
  

您有一个数据访问层类/对象,它将您的 ajax 调用包装到 api。使用商店中的状态作为输入,并从成功函数中调用触发器更改。这是我在使用flux npm 模块时看到的原始解决方案,如果您不使用waitFor

【讨论】:

嗨!我不想从商店调用操作。 “Flux 应用程序中的数据单向流动”:facebook.github.io/flux/docs/overview.html 您不会使用操作来进行该 API 调用。您正在将 api 移动到第一个动作的循环中 我的错误。我说是因为我们在调用 API 之后调度 API 结果(有效负载),因为一些组件正在监听这个 API 调用。我们的解决方案类似:github.com/schempy/react-flux-api-calls。而且我无法从操作 A 分派所有 API 调用,因为这个 Store 不知道需要什么 API 调用,因为只有组件(Y、Z 等)知道这一点。我将就这个问题举两个实际的例子来说明问题。

以上是关于在侦听器回调后调用操作并且...无法在调度中间调度?的主要内容,如果未能解决你的问题,请参考以下文章

React Hook - 无法在子组件 onComplete 回调中调用父组件调度

Redux 工具包:从 extraReducers 侦听器调度操作?

React 和 Flux:“在调度中间调度”以显示来自 API 调用的错误消息

在自定义 serviceWorker 中调度 redux 操作

调度操作后 Redux 状态未更新

Flux/Alt Basic 异步示例抛出“无法在调度中间调度”