在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]
}));
});
知道为什么它在史诗中表现不同吗?
答案 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")
操作上)。它会创建新的E
和F
操作,这些操作会立即合并到链中。