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)(…)。延迟不是一个函数