【发布时间】:2016-04-22 02:21:46
【问题描述】:
我似乎遇到了在 Flux 中无法避免 dispatch-within-a-dispatch 问题的情况。
我已经阅读了一些关于这个问题的类似问题,但除了setTimeout hacks 之外似乎没有一个很好的解决方案,我想避免这些问题。
我实际上使用的是alt.js 而不是 Flux,但我认为这些概念是相同的。
场景
想象一个最初呈现登录表单的组件。当用户登录时,这会触发 XHR,该 XHR 最终会以身份验证信息(例如用户名)进行响应,然后根据身份验证信息获取一些安全数据并呈现它而不是登录表单。
我遇到的问题是,当我尝试触发一个动作以根据 XHR 响应获取数据时,它仍然处于 LOGIN_RESPONSE 动作的调度中,并触发了可怕的
Error: Invariant Violation: Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch.
示例
我创建了this jsfiddle 来演示这个问题。
我有一个Wrapper 组件,它根据用户是否设置在MyStore 中来呈现登录按钮或Contents 子组件。
- 首先在
Wrapper组件中渲染登录按钮。 - 单击按钮会调度
LOGIN操作。 - 延迟后,将调度
LOGIN_RESPONSE操作(通过 async mechanism in alt.js)。 - 此操作触发
MyStore更新用户名。 -
Wrapper组件观察存储变化并更新其状态。 - 这会导致
Wrapper呈现Content组件而不是登录按钮。 -
Content组件在挂载时尝试调度FETCH_DATA操作,但由于调度程序仍在调度LOGIN_RESPONSE而失败。 (如果我将FETCH_DATA调度包在setTimeout中,它可以工作,但感觉就像是 hack)。
这似乎是一种常见的情况。事实上,几乎所有相关问题都有类似的场景,但没有好的或具体的答案。
- React - Authentication process : Cannot dispatch in the middle of a dispatch
- Dispatching cascading/dependent async requests in Flux/React
- Flux Dispatch.dispatch(...): Cannot dispatch in the middle of a dispatch
此数据流是否存在本质上的问题?做这种事情的正确 Flux 方式是什么?
【问题讨论】:
标签: javascript reactjs flux