Rxjs Redux Observable:如何在flatMap中使用takeUntil?
我有一个平面图,用于发出两个动作:Rxjs Redux Observable:如何在flatMap中使用takeUntil?,rxjs,redux-observable,Rxjs,Redux Observable,我有一个平面图,用于发出两个动作: 导出默认函数searchForPartner(action$,store){ 返回类型为的操作$(statusActions.SEARCH\u以查找合作伙伴) .filter(()=>store.getState().user.signedIn) .延迟(2000年) .flatMap(()=>[ carouselActions.slideTo(配置CAROUSEL\u SLIDES.CONFIRM\u CHAT), statusActions.foundPe
导出默认函数searchForPartner(action$,store){
返回类型为的操作$(statusActions.SEARCH\u以查找合作伙伴)
.filter(()=>store.getState().user.signedIn)
.延迟(2000年)
.flatMap(()=>[
carouselActions.slideTo(配置CAROUSEL\u SLIDES.CONFIRM\u CHAT),
statusActions.foundPerson(),
])
.takeUntil(类型的动作$(carouselActions.TAP_CANCEL))
};
但是,takeUntil
位于错误的位置。当发出TAP\u CANCEL
时,它将取消整个epic。相反,我只希望它取消flatMap
中动作的发出。我该怎么做
==更新===
我把它玩弄了,这看起来有用吗?但我不喜欢有两个计时器:
导出默认函数searchForPartner(action$,store){
返回类型为的操作$(statusActions.SEARCH\u以查找合作伙伴)
.filter(()=>store.getState().user.signedIn)
.mergeMap(()=>
可观察的合并(
可观测计时器(2000)
.map(()=>carouselActions.slideTo(config.CAROUSEL\u SLIDES.CONFIRM\u CHAT)),
可观测计时器(2000)
.map(()=>statusActions.foundPerson())
)
.takeUntil(类型的动作$(carouselActions.TAP_CANCEL))
)
};
你需要将延迟
和延迟
隔离到内部可观察物中,最重要的是你启动延迟
计时器,然后延迟
它,这样如果有人取消它,你肯定在听——如果你的延迟
在外部,你还不会听到取消操作!这是微妙的,但理解原因很重要
export default function searchForPartner(action$, store) {
return action$.ofType(statusActions.SEARCH_FOR_PARTNER)
.filter(() => store.getState().user.signedIn)
.flatMap(() =>
Observable.of(
carouselActions.slideTo(config.CAROUSEL_SLIDES.CONFIRM_CHAT),
statusActions.foundPerson()
)
.delay(2000)
.takeUntil(action$.ofType(carouselActions.TAP_CANCEL))
);
}
你也可以考虑使用<代码>开关图< /C> >而不是<代码>平面图< /C> >(AK<代码> CyMeMeP),因为如果另一个代码> SHICHCHYFRYPARTHON/<代码>进来,而前一个仍然在等待,那么你将有一个排队的队列。可能你不想要,但你必须打那个电话。
所以如果在2000年延迟期间收到点击取消
,你不想发出动作吗?嗯,如果收到点击取消
,我想取消平面图
中所有内容的执行。我想我的延迟(2000)
可能是错误的spot@cartant用我抛出的难看的解决方案更新了问题正确,我不想看到旋转木马的副作用。滑动到和状态操作。在延迟2秒钟之前调用了点击取消时,会发生foundPerson。哇,太好了!有没有一本书/网站让你学到这些东西?rx文档非常糟糕,我主要是通过经验学到的,以前我是核心团队的成员。你在看哪些文件?如果您还没有读过,我建议您从头到尾阅读这篇文章:另一件有帮助的事情是基本上构建一个“RxJS lite克隆”。了解它的工作原理,这将使它不那么神奇呵呵:)太棒了,我来看看!感谢一个lotRxJs错误:TypeError:(0,rxjs.of)(…)。延迟不是一个函数