等待可观察到的Redux操作序列

等待可观察到的Redux操作序列,redux,redux-observable,Redux,Redux Observable,我有一个用例,我需要等待一系列操作,然后再使用Redux观察值发送另一个操作。我见过一些类似的问题,但我无法理解如何将这些方法用于给定的用例 本质上,我想这样做: action$ .ofType(PAGINATION_CLICKED) // This action occurred. .ofType(FETCH_SUCCESS) // Then this action occurred after. .map(() => analyticsAction()); // Dispa

我有一个用例,我需要等待一系列操作,然后再使用Redux观察值发送另一个操作。我见过一些类似的问题,但我无法理解如何将这些方法用于给定的用例

本质上,我想这样做:

action$
  .ofType(PAGINATION_CLICKED) // This action occurred.
  .ofType(FETCH_SUCCESS) // Then this action occurred after.
  .map(() => analyticsAction()); // Dispatch analytics.

例如,如果另一个类型为
FETCH\u ERROR
的操作触发,我还想取消并重新启动该序列。

好问题。重要的一点是,
action$
是调度的所有操作的热/多播流(这是一个主题)。因为它很热,我们可以将它组合多次,他们都会听到相同的动作流

// uses switchMap so if another PAGINATION_CLICKED comes in
// before FETCH_SUCCESS we start over

action$
  .ofType(PAGINATION_CLICKED)
  .switchMap(() =>
    action$.ofType(FETCH_SUCCESS)
      .take(1) // <-------------------- very important!
      .map(() => analyticsAction())
      .takeUntil(action$.ofType(FETCH_ERROR))
  );
这是同样的事情,但是使用
race
作为实例操作符,而不是静态操作符。这是您可以选择的风格偏好。他们都做同样的事情。使用您更清楚的选项

action$
  .ofType(PAGINATION_CLICKED)
  .switchMap(() =>
    action$.ofType(FETCH_SUCCESS)
      .map(() => analyticsAction())
      .race(
        action$.ofType(FETCH_ERROR)
          .map(() => someOtherAnalyticsAction())
      )
      .take(1)
  );

我快到了!最后我给出了您的第一个示例,但没有(现在显然很关键)
take(1)
。这基本上意味着“序列”在第一次“分页”点击后被忽略。非常感谢,对库的巨大支持:)与race不同,是否有一种方法可以表明我希望在生成第三个操作之前调用/完成这两个操作?编辑:nvm,我想我用zip操作符解决了这个问题。改变生活的技巧!在第一个代码示例中使用exaustMap而不是switchMap不是更好吗?如果方法analyticsAction()需要一些时间,并且我们同时收到了分页操作,它将取消方法analyticsAction()
action$
  .ofType(PAGINATION_CLICKED)
  .switchMap(() =>
    action$.ofType(FETCH_SUCCESS)
      .map(() => analyticsAction())
      .race(
        action$.ofType(FETCH_ERROR)
          .map(() => someOtherAnalyticsAction())
      )
      .take(1)
  );