Redux Observable:如何在 flatMap 中使用 takeUntil?

Redux Observable: How to use takeUntil inside flatMap?

我有一个平面图,目的是发出两个动作:

export default function searchForPartner(action$, store) {
  return action$.ofType(statusActions.SEARCH_FOR_PARTNER)
    .filter(() => store.getState().user.signedIn)
    .delay(2000)
    .flatMap(() => [
      carouselActions.slideTo(config.CAROUSEL_SLIDES.CONFIRM_CHAT),
      statusActions.foundPerson(),
    ])
    .takeUntil(action$.ofType(carouselActions.TAP_CANCEL))
};

然而,takeUntil 放错了位置。当 TAP_CANCEL 发出时,它正在取消整个史诗。相反,我只希望它取消 flatMap 内的动作的发射。我该怎么做?

===更新===

我胡思乱想了,这似乎行得通?但我不喜欢有 2 个计时器:

export default function searchForPartner(action$, store) {
  return action$.ofType(statusActions.SEARCH_FOR_PARTNER)
    .filter(() => store.getState().user.signedIn)
    .mergeMap(() =>
      Observable.merge(
        Observable.timer(2000)
          .map(() => carouselActions.slideTo(config.CAROUSEL_SLIDES.CONFIRM_CHAT)),
        Observable.timer(2000)
          .map(() => statusActions.foundPerson())
      )
      .takeUntil(action$.ofType(carouselActions.TAP_CANCEL))
    )
};

你需要将 delaytakeUntil 隔离到内部 Observable 中,最重要的是你启动 delay 计时器,然后 takeUntil 它,这样如果有人取消它,您肯定会收听——如果您的 delay 在外面,您还不会收听取消操作!这很微妙,但对于理解原因很重要。

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))
    );
}

您可能还想考虑使用 switchMap 而不是 flatMap(又名 mergeMap),因为如果另一个 SEARCH_FOR_PARTNER 在前一个还在等待时进来,您他们会排成一排。可能不想要你想要的,但你必须打电话。