我有一个组件,我们称之为List
,它会调用一个动作创建者Action1.getItems()
。
在Action1.getItems()
从服务器检索信息后,我需要调用另一个操作创建者:Action2.getMoreItems()
,这是另一个文件中完全不同的操作。
事实:
Action2.getMoreItems()
的{{1}}内拨打_onChange()
,因为它会引发错误“List
”可能性?
Cannot dispatch in the middle of a dispatch ...
内调用Action2.getMoreItems()
Action1.getItems()
并在Action1.getItems(callback)
组件的回调中调用Action2.getMoreItems()
。我相信这可能是Flux的一个非常基本的用法,但我仍然无法理解如何正确使用它,这两种解决方案对我来说都很难看。
建议?
谢谢!
答案 0 :(得分:3)
getMoreItems
是否依赖于getItems
的返回值?如果是,您可以在.then
的{{1}}回调中调用该操作。
如果不是,那么你可以同时调用两个调用,然后连接承诺的结果。
所以我的投票是你问题中的第2位。我根本不认为这是一个丑陋的解决方案。您负责将物品和更多物品带到您的行动中。组件本身对此一无所知,只是发送了对这些项目的请求。它们的构建方式应该对组件透明。
答案 1 :(得分:2)
大多数flux实现都有一个类似" waitFor"的方法,它允许商店等待另一个商店完成。
假设您的商店需要两个执行2方法:GetUser
和GetPermissions
。第一个获取用户,后者获取获取的用户具有的权限。显然,GetPermissions
需要等待从第一个方法中提取用户对象。
在这种情况下,您将调度名为GetUser
的操作,并使商店功能的两个听取该操作。因此,如果您发送GetUser
,则会执行两种存储方法。
在alt.js(flux实现)和许多其他方面,有waitFor(store)
等方法,因此GetPermissions
可以等待UserStore获取用户。在alt.js伪代码中,这将是这样的:
// UserStore
function getUser() {
fetch('api/user').then(this.setState);
}
// PermissionsStore
function getPermissions() {
this.waitFor(UserStore);
let user = UserStore.getState().user;
fetch('api/permission', user).then(this.setState);
}
正如我所说,这不是伪代码,但它显示了这个概念。如果您有兴趣,通量实现alt.js很棒。请查看alt.js.org