在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示例。
问题是,我不确定为什么第一次尝试不起作用,因为在下面的示例中,它在史诗级之外效果很好:
var observable = Observable.of({type: "A"})
.mapTo({type: "B"})
.merge(Observable.of({ type: "C" }));
observable.subscribe(value => {
this.setState(prevState => ({
values: [...prevState.values, value]
}));
});
知道为什么它在史诗中表现不同吗?
这不是因为您正在使用史诗。第一个示例使用.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
被立即合并到链行动。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句