Observable.merge 在史诗中表现不同

Observable.merge behaves differently in an epic

在 React/Redux 应用程序中,我使用 Redux Observable 并且我想要一个史诗来输出两个不同的动作。

首先,我尝试了这个:

const epic1 = action$ =>
  action$
    .ofType("A")
    .mapTo({ type: "B" })
    .merge(Observable.of({ type: "C" }));

因为它不起作用,我不得不切换到:

const epic2 = action$ =>
  action$
    .ofType("D")
    .mergeMap(value =>
      Observable.merge(
        Observable.of({ type: "E" }),
        Observable.of({ type: "F" })
      )
    );

查看此 CodeSandbox example

问题是,我不确定为什么第一次尝试不起作用,因为在下面的示例中,它在史诗之外运行良好:

var observable = Observable.of({type: "A"})
  .mapTo({type: "B"})
  .merge(Observable.of({ type: "C" }));

observable.subscribe(value => {
  this.setState(prevState => ({
    values: [...prevState.values, value]
  }));
});

知道为什么它在史诗中的表现不同吗?

这不是因为您正在使用 epics。第一个示例使用 .merge(Observable.of({ type: "C" })),因此它会立即订阅 Observable.of({ type: "C" }),而您订阅 epic1。但是,您使用的是 redux,因此订阅发生在 redux 内部的某处,并且 Observable.of({ type: "C" }) 立即发出,您甚至不知道它何时发生。然后任何其他操作 .ofType("A") 都不会改变,因为 .merge(Observable.of({ type: "C" })) 已经发出了它的唯一值。

这也解释了为什么您在问题末尾提到的示例按预期工作。

另一方面,当您使用 mergeMap 时,会在源可观察对象的每次发射时调用回调(在每个 action$.ofType("D") 操作上)。它会创建新的 EF 操作,这些操作会立即合并到链中。