在 redux-observable 中,我如何控制 reducer 或 epics 是不是首先对动作做出反应?

Posted

技术标签:

【中文标题】在 redux-observable 中,我如何控制 reducer 或 epics 是不是首先对动作做出反应?【英文标题】:In redux-observable, how do I control whether the reducers or epics react to an action first?在 redux-observable 中,我如何控制 reducer 或 epics 是否首先对动作做出反应? 【发布时间】:2017-12-13 13:19:56 【问题描述】:

例如对于某些动作,我希望减速器在史诗之前处理它。对于其他动作,反之亦然。有没有办法做到这一点?

【问题讨论】:

根据specs,史诗在减速器之后运行。你想达到什么目的?您是否希望在数据更改时触发操作? This answer 对此提供了一些见解。 @NikosParaskevopoulos 在史诗中,我正在发送一个创建承诺的动作。当 promise 成功时,我想在 reducer 处理它之前调度另一个动作。我这样做是因为我希望第二个动作的行为取决于它的调度方式。 @LeoJiang 嗯,目前还不清楚您要做什么。 “我想在减速器处理它之前调度另一个动作”是什么意思?如果你描述什么你想要完成,而不是如何你认为你应该完成它,也许我们会更好地理解?即“我这样做是因为我希望第二个动作根据它的调度方式表现不同”这很接近,但没有说明原因。到目前为止,根据提供的信息,这一切似乎都是一个奇怪的要求。 有一个动作FETCH_USERS 创建一个网络请求。当网络请求完成时,FETCH_USERS_FULFILLED 被分派,reducer 将获取的用户附加到要显示的用户列表中。还有一个动作FILTER_USERS,它重用FETCH_USERS 来获取用户列表,但应用了过滤器。但是,在减速器附加获取的用户之前,我想清除要显示的用户列表。这样,为了过滤,获取的用户会替换现有的用户,而不是附加到他们身上。 (续) 我想等到网络请求成功后再清除用户,因为我认为有一个灰色的用户列表比有一个加载屏幕更好。 【参考方案1】:

据我所知,您无法修改它 - 减速器将始终首先运行。 relevant chunk of redux-observable 是:

  return action => 
    const result = next(action);
    input$.next(action);
    return result;
  ;

中间件总是首先将动作传递给管道中的下一个中间件,从而使其到达减速器。只有在返回之后,它才会将动作输入到史诗中。 Redux-Saga 做同样的事情。

【讨论】:

补充一点,是 specified 在 reducer 之后 运行史诗:“在 reducer 已经完成之后,Epic 与正常的 Redux 调度通道一起运行收到了[...]”.【参考方案2】:

对于您希望史诗在 reducer 之前运行的任何操作,请执行 2 个操作。

操作 A:在应用程序中发送这个,在史诗中注意它。如果合适,不要在减速器中对它做任何事情。

Action B:如果 Action A 满足正确的条件,则在 Epic 中调度这个。在减速器中处理这个。

【讨论】:

当Action A没有改变时,这会导致商店广播是否有意义? @fionbio 我不确定如果减速器中确实没有任何更改总是有意义的。我认为它通常只是为了在应用程序中提供更简单、一致的 API。当我使用这种模式时,Action A 通常会切换一个布尔标志,如“isLoading: true”,然后史诗将调度一个成功或失败的动作,每个动作都会将该标志重置为“false”以及任何其他状态更改。 谢谢。在探索了 redux 之后——我放弃并去了 Mobx,现在我是一个更快乐的人了。

以上是关于在 redux-observable 中,我如何控制 reducer 或 epics 是不是首先对动作做出反应?的主要内容,如果未能解决你的问题,请参考以下文章

在 redux-observable 中,我如何控制 reducer 或 epics 是不是首先对动作做出反应?

在使用 redux-observables 开始另一个史诗之前,如何等待不同的史诗完成并更新商店?

如何在redux-observable中同时进行多个ajax调用?

在 Axios 中使用 Redux-Observable 的问题

如何从 typesafe redux-observable epic 中收听“@@router/LOCATION_CHANGE”动作

如何通过 redux-observable/rxjs 使用 Firestore 实时更新(onSnapshot)?