React + Flux:在另一个动作之后调用动作的最佳实践?

时间:2016-06-30 17:00:13

标签: reactjs action flux

我有一个组件,我们称之为List,它会调用一个动作创建者Action1.getItems()。 在Action1.getItems()从服务器检索信息后,我需要调用另一个操作创建者:Action2.getMoreItems(),这是另一个文件中完全不同的操作。

事实:

  1. 两个动作创建者都会调度动作并更改商店。
  2. 我无法在Action2.getMoreItems()的{​​{1}}内拨打_onChange(),因为它会引发错误“List
  3. 可能性?

    1. 服务器返回后,在Cannot dispatch in the middle of a dispatch ...内调用Action2.getMoreItems()
    2. 添加回调,以便我Action1.getItems()并在Action1.getItems(callback)组件的回调中调用Action2.getMoreItems()
    3. 我相信这可能是Flux的一个非常基本的用法,但我仍然无法理解如何正确使用它,这两种解决方案对我来说都很难看。

      建议?

      谢谢!

2 个答案:

答案 0 :(得分:3)

getMoreItems是否依赖于getItems的返回值?如果是,您可以在.then的{​​{1}}回调中调用该操作。

如果不是,那么你可以同时调用两个调用,然后连接承诺的结果。

所以我的投票是你问题中的第2位。我根本不认为这是一个丑陋的解决方案。您负责将物品和更多物品带到您的行动中。组件本身对此一无所知,只是发送了对这些项目的请求。它们的构建方式应该对组件透明。

答案 1 :(得分:2)

大多数flux实现都有一个类似" waitFor"的方法,它允许商店等待另一个商店完成。

假设您的商店需要两个执行2方法:GetUserGetPermissions。第一个获取用户,后者获取获取的用户具有的权限。显然,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