Observable.merge在史诗中表现不同

时间:2018-05-07 18:12:13

标签: reactjs redux rxjs redux-observable

在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 sample

问题是,我不确定为什么第一次尝试没有效果,因为在下面的例子中,它在史诗之外很有效:

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

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

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

1 个答案:

答案 0 :(得分:1)

这不是因为您正在使用史诗。第一个示例使用.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操作,这些操作会立即合并到链中。