异步操作的流量存储依赖关系
Flux store dependency with async actions
我在理解使用Flux模式的最佳方法时遇到了问题。例如,我有一个userStore
,我听它。一旦它改变,我需要获得user.name
并访问colors[user.name]
,但colors
对象来自我的另一个colorsStore
存储。它的本质是:
var self = {};
userStore.addListener(function(user) {
// dependency with the colors store
var color = self.colors[user.name]
})
colorsStore.addListener(function(colors) {
self.colors = colors;
})
actions.getUser() // modifies userStore
actions.getColors() // modifies colorsStore
问题是这两个操作是异步的(例如,它们从AJAX调用中获取数据)。考虑到这一点,userStore
可能会在从其他存储填充self.colors
变量之前发生更改。
使用通量模式是如何处理的?Dispatcher
对此有帮助吗?抱歉,我是通量模式的新手。直觉上,我只需按照适当的顺序调用异步操作,例如:
actions.getColors() // need to populate self.colors before running getUser()
.then(actions.getUser())
但我想知道是否还有一种更为Flux的方式来做到这一点。
从通量的角度来看,您的设置很好。您的组件需要能够处理由您的操作生成的不同可能(存储)状态,这些状态可能包括:
- 用户存储有旧数据/没有数据,颜色存储已经有最新数据
- 用户存储有最新的用户数据,颜色存储仍有旧数据
如果你希望这些状态中的任何一个以某种方式对用户可见(例如,显示加载指示器,在等待最新颜色时显示旧颜色/默认颜色),那么反应通量的方法就是在组件内部处理这些状态。
如果您不想向用户显示有关这些状态的任何信息,您有两个选项:
- 在组件内部,从colorStore侦听器函数内部启动
actions.getUser()
(快速而肮脏的解决方案) - 更改设置以防止不需要的存储状态触发组件更新
对于第二种解决方案,您通常可以执行以下操作:
- 你有两个动作都开火吗
- 两个监听器触发相同的函数
getStateFromStores()
- 该函数从两个存储中获取状态,并且只有在用户和颜色匹配时才更新组件(
setState()
)
这样,异步调用可以按任何顺序返回。
如果我正确理解您的问题,您可以在这种情况下使用waitFor。还有关于"waitFor vs将商店合并为一个"的讨论,所以合并商店也可以解决你的问题。
相关文章:
- 单元测试依赖关系没有被嘲笑
- FRP 中 EventStreams 的循环依赖关系
- 节点模块依赖关系
- 在Meteor中使用具有依赖关系的NPM包
- requirejs定义:嵌套依赖关系
- Django管道和javascript依赖关系
- 在Aurelia computeds中,当设置依赖关系时,如何声明对对象属性的依赖关系
- Npm未满足对等依赖关系
- Node.JS处理重复的可传递依赖关系
- 在Firefox上使用聚合物的javascript依赖关系的HTML导入困难;Safari
- 库中的匿名定义()模块's的依赖关系导致库损坏'的家属
- 使用Require.js按照依赖关系的顺序加载JavaScript
- GraphQL代码中的Javascript循环依赖关系
- 使用 grunt 检查单个 javascript 文件时如何解决依赖关系
- 与超类的依赖关系
- 在 Angular JS 业力测试中管理依赖关系
- 在 webpack 中管理 jQuery 插件依赖关系
- requirejs+bower,bower组件中的路径和依赖关系
- 预构建的NPM包:如何为用户省去依赖关系
- 聚合物种子-自定义元素依赖关系